mirror of
https://github.com/stonega/tsacdop
synced 2025-02-10 00:20:49 +01:00
Add setting - change tap to open popup menu.
This commit is contained in:
parent
73d305e3e3
commit
3f2dba63c2
@ -260,6 +260,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"settingsStorageDes" : MessageLookupByLibrary.simpleMessage("Manange cache and download storage"),
|
"settingsStorageDes" : MessageLookupByLibrary.simpleMessage("Manange cache and download storage"),
|
||||||
"settingsSyncing" : MessageLookupByLibrary.simpleMessage("Syncing"),
|
"settingsSyncing" : MessageLookupByLibrary.simpleMessage("Syncing"),
|
||||||
"settingsSyncingDes" : MessageLookupByLibrary.simpleMessage("Refresh podcasts in the background"),
|
"settingsSyncingDes" : MessageLookupByLibrary.simpleMessage("Refresh podcasts in the background"),
|
||||||
|
"settingsTapToOpenPopupMenu" : MessageLookupByLibrary.simpleMessage("Tap to open popup menu"),
|
||||||
|
"settingsTapToOpenPopupMenuDes" : MessageLookupByLibrary.simpleMessage("You need to long press to open episode page"),
|
||||||
"settingsTheme" : MessageLookupByLibrary.simpleMessage("Theme"),
|
"settingsTheme" : MessageLookupByLibrary.simpleMessage("Theme"),
|
||||||
"settingsUpdateInterval" : MessageLookupByLibrary.simpleMessage("Update interval"),
|
"settingsUpdateInterval" : MessageLookupByLibrary.simpleMessage("Update interval"),
|
||||||
"settingsUpdateIntervalDes" : MessageLookupByLibrary.simpleMessage("Default 24 hours"),
|
"settingsUpdateIntervalDes" : MessageLookupByLibrary.simpleMessage("Default 24 hours"),
|
||||||
|
@ -260,6 +260,8 @@ class MessageLookup extends MessageLookupByLibrary {
|
|||||||
"settingsStorageDes" : MessageLookupByLibrary.simpleMessage("管理缓存和下载空间"),
|
"settingsStorageDes" : MessageLookupByLibrary.simpleMessage("管理缓存和下载空间"),
|
||||||
"settingsSyncing" : MessageLookupByLibrary.simpleMessage("同步"),
|
"settingsSyncing" : MessageLookupByLibrary.simpleMessage("同步"),
|
||||||
"settingsSyncingDes" : MessageLookupByLibrary.simpleMessage("在后台更新播客"),
|
"settingsSyncingDes" : MessageLookupByLibrary.simpleMessage("在后台更新播客"),
|
||||||
|
"settingsTapToOpenPopupMenu" : MessageLookupByLibrary.simpleMessage("轻点打开弹出菜单"),
|
||||||
|
"settingsTapToOpenPopupMenuDes" : MessageLookupByLibrary.simpleMessage("开启后您需长按打开节目页"),
|
||||||
"settingsTheme" : MessageLookupByLibrary.simpleMessage("主题"),
|
"settingsTheme" : MessageLookupByLibrary.simpleMessage("主题"),
|
||||||
"settingsUpdateInterval" : MessageLookupByLibrary.simpleMessage("更新频率"),
|
"settingsUpdateInterval" : MessageLookupByLibrary.simpleMessage("更新频率"),
|
||||||
"settingsUpdateIntervalDes" : MessageLookupByLibrary.simpleMessage("默认 24 小时"),
|
"settingsUpdateIntervalDes" : MessageLookupByLibrary.simpleMessage("默认 24 小时"),
|
||||||
|
@ -1889,6 +1889,26 @@ class S {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `Tap to open popup menu`
|
||||||
|
String get settingsTapToOpenPopupMenu {
|
||||||
|
return Intl.message(
|
||||||
|
'Tap to open popup menu',
|
||||||
|
name: 'settingsTapToOpenPopupMenu',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `You need to long press to open episode page`
|
||||||
|
String get settingsTapToOpenPopupMenuDes {
|
||||||
|
return Intl.message(
|
||||||
|
'You need to long press to open episode page',
|
||||||
|
name: 'settingsTapToOpenPopupMenuDes',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// `Theme`
|
/// `Theme`
|
||||||
String get settingsTheme {
|
String get settingsTheme {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
|
@ -493,13 +493,16 @@ class ShowEpisode extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Tuple4<int, bool, bool, List<int>>> _initData(
|
Future<Tuple5<int, bool, bool, bool, List<int>>> _initData(
|
||||||
EpisodeBrief episode) async {
|
EpisodeBrief episode) async {
|
||||||
|
List<int> menuList = await _getEpisodeMenu();
|
||||||
|
bool tapToOpen = await _getTapToOpenPopupMenu();
|
||||||
int listened = await _isListened(episode);
|
int listened = await _isListened(episode);
|
||||||
|
|
||||||
bool liked = await _isLiked(episode);
|
bool liked = await _isLiked(episode);
|
||||||
bool downloaded = await _isDownloaded(episode);
|
bool downloaded = await _isDownloaded(episode);
|
||||||
List<int> menuList = await _getEpisodeMenu();
|
|
||||||
return Tuple4(listened, liked, downloaded, menuList);
|
return Tuple5(listened, liked, downloaded, tapToOpen, menuList);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<int> _isListened(EpisodeBrief episode) async {
|
Future<int> _isListened(EpisodeBrief episode) async {
|
||||||
@ -523,6 +526,13 @@ class ShowEpisode extends StatelessWidget {
|
|||||||
return await dbHelper.isDownloaded(episode.enclosureUrl);
|
return await dbHelper.isDownloaded(episode.enclosureUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> _getTapToOpenPopupMenu() async {
|
||||||
|
KeyValueStorage tapToOpenPopupMenuStorage =
|
||||||
|
KeyValueStorage(tapToOpenPopupMenuKey);
|
||||||
|
int boo = await tapToOpenPopupMenuStorage.getInt(defaultValue: 0);
|
||||||
|
return boo == 1;
|
||||||
|
}
|
||||||
|
|
||||||
_markListened(EpisodeBrief episode) async {
|
_markListened(EpisodeBrief episode) async {
|
||||||
DBHelper dbHelper = DBHelper();
|
DBHelper dbHelper = DBHelper();
|
||||||
bool marked = await dbHelper.checkMarked(episode);
|
bool marked = await dbHelper.checkMarked(episode);
|
||||||
@ -543,173 +553,6 @@ class ShowEpisode extends StatelessWidget {
|
|||||||
await dbHelper.setUniked(url);
|
await dbHelper.setUniked(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
// _showPopupMenu(Offset offset, EpisodeBrief episode, BuildContext context,
|
|
||||||
// bool isPlaying, bool isInPlaylist) async {
|
|
||||||
// var audio = Provider.of<AudioPlayerNotifier>(context, listen: false);
|
|
||||||
// double left = offset.dx;
|
|
||||||
// double top = offset.dy;
|
|
||||||
// bool isLiked, isDownload;
|
|
||||||
// int isListened;
|
|
||||||
// var downloader = Provider.of<DownloadState>(context, listen: false);
|
|
||||||
// List<int> menuList = await _getEpisodeMenu();
|
|
||||||
// if (menuList.contains(3)) isListened = await _isListened(episode);
|
|
||||||
// if (menuList.contains(2)) isLiked = await _isLiked(episode);
|
|
||||||
// if (menuList.contains(4)) isDownload = await _isDownloaded(episode);
|
|
||||||
// await showMenu<int>(
|
|
||||||
// shape: RoundedRectangleBorder(
|
|
||||||
// borderRadius: BorderRadius.all(Radius.circular(10))),
|
|
||||||
// context: context,
|
|
||||||
// position: RelativeRect.fromLTRB(left, top, context.width - left, 0),
|
|
||||||
// items: <PopupMenuEntry<int>>[
|
|
||||||
// PopupMenuItem(
|
|
||||||
// value: 0,
|
|
||||||
// child: Row(
|
|
||||||
// mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
// mainAxisSize: MainAxisSize.max,
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(
|
|
||||||
// LineIcons.play_circle_solid,
|
|
||||||
// color: Theme.of(context).accentColor,
|
|
||||||
// ),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// !isPlaying ? Text('Play') : Text('Playing'),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// menuList.contains(1)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 1,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(
|
|
||||||
// LineIcons.clock_solid,
|
|
||||||
// color: Colors.red,
|
|
||||||
// ),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// !isInPlaylist ? Text('Later') : Text('Remove')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// menuList.contains(2)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 2,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(LineIcons.heart, color: Colors.red, size: 21),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// isLiked
|
|
||||||
// ? Text(
|
|
||||||
// 'Unlike',
|
|
||||||
// )
|
|
||||||
// : Text('Like')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// menuList.contains(3)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 3,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// SizedBox(
|
|
||||||
// width: 23,
|
|
||||||
// height: 23,
|
|
||||||
// child: CustomPaint(
|
|
||||||
// painter:
|
|
||||||
// ListenedAllPainter(Colors.blue, stroke: 1.5)),
|
|
||||||
// ),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// isListened > 0
|
|
||||||
// ? Text('Listened',
|
|
||||||
// style: TextStyle(
|
|
||||||
// color: context.textColor.withOpacity(0.5)))
|
|
||||||
// : Text('Mark\nListened')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// menuList.contains(4)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 4,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(LineIcons.download_solid, color: Colors.green),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// isDownload
|
|
||||||
// ? Text('Downloaded',
|
|
||||||
// style: TextStyle(
|
|
||||||
// color: context.textColor.withOpacity(0.5)))
|
|
||||||
// : Text('Download')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// ],
|
|
||||||
// elevation: 5.0,
|
|
||||||
// ).then((value) async {
|
|
||||||
// switch (value) {
|
|
||||||
// case 0:
|
|
||||||
// if (!isPlaying) audio.episodeLoad(episode);
|
|
||||||
// break;
|
|
||||||
// case 1:
|
|
||||||
// if (!isInPlaylist) {
|
|
||||||
// audio.addToPlaylist(episode);
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Added to playlist',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// audio.delFromPlaylist(episode);
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Removed from playlist',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case 2:
|
|
||||||
// if (isLiked) {
|
|
||||||
// await _setUnliked(episode.enclosureUrl);
|
|
||||||
// audio.setEpisodeState = true;
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Unliked',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// await _saveLiked(episode.enclosureUrl);
|
|
||||||
// audio.setEpisodeState = true;
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Liked',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case 3:
|
|
||||||
// if (isListened < 1) {
|
|
||||||
// await _markListened(episode);
|
|
||||||
// audio.setEpisodeState = true;
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Mark listened',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// case 4:
|
|
||||||
// if (!isDownload) downloader.startTask(episode);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
double _width = context.width;
|
double _width = context.width;
|
||||||
@ -743,15 +586,16 @@ class ShowEpisode extends StatelessWidget {
|
|||||||
.toList(),
|
.toList(),
|
||||||
),
|
),
|
||||||
builder: (_, data, __) => FutureBuilder<
|
builder: (_, data, __) => FutureBuilder<
|
||||||
Tuple4<int, bool, bool, List<int>>>(
|
Tuple5<int, bool, bool, bool, List<int>>>(
|
||||||
future: _initData(episodes[index]),
|
future: _initData(episodes[index]),
|
||||||
initialData: Tuple4(0, false, false, []),
|
initialData: Tuple5(0, false, false, false, []),
|
||||||
builder:
|
builder:
|
||||||
(BuildContext context, AsyncSnapshot snapshot) {
|
(BuildContext context, AsyncSnapshot snapshot) {
|
||||||
int isListened = snapshot.data.item1;
|
int isListened = snapshot.data.item1;
|
||||||
bool isLiked = snapshot.data.item2;
|
bool isLiked = snapshot.data.item2;
|
||||||
bool isDownloaded = snapshot.data.item3;
|
bool isDownloaded = snapshot.data.item3;
|
||||||
List<int> menuList = snapshot.data.item4;
|
bool tapToOpen = snapshot.data.item4;
|
||||||
|
List<int> menuList = snapshot.data.item5;
|
||||||
return Container(
|
return Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius:
|
borderRadius:
|
||||||
@ -767,7 +611,9 @@ class ShowEpisode extends StatelessWidget {
|
|||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.all(Radius.circular(15.0))),
|
BorderRadius.all(Radius.circular(15.0))),
|
||||||
duration: Duration(milliseconds: 100),
|
duration: Duration(milliseconds: 100),
|
||||||
tapMode: TapMode.onLongPress,
|
tapMode: tapToOpen
|
||||||
|
? TapMode.onTap
|
||||||
|
: TapMode.onLongPress,
|
||||||
animateMenuItems: false,
|
animateMenuItems: false,
|
||||||
blurBackgroundColor:
|
blurBackgroundColor:
|
||||||
context.brightness == Brightness.light
|
context.brightness == Brightness.light
|
||||||
|
@ -421,6 +421,10 @@
|
|||||||
"@settingsSyncing": {},
|
"@settingsSyncing": {},
|
||||||
"settingsSyncingDes": "Refresh podcasts in the background",
|
"settingsSyncingDes": "Refresh podcasts in the background",
|
||||||
"@settingsSyncingDes": {},
|
"@settingsSyncingDes": {},
|
||||||
|
"settingsTapToOpenPopupMenu": "Tap to open popup menu",
|
||||||
|
"@settingsTapToOpenPopupMenu": {},
|
||||||
|
"settingsTapToOpenPopupMenuDes": "You need to long press to open episode page",
|
||||||
|
"@settingsTapToOpenPopupMenuDes": {},
|
||||||
"settingsTheme": "Theme",
|
"settingsTheme": "Theme",
|
||||||
"@settingsTheme": {},
|
"@settingsTheme": {},
|
||||||
"settingStorage": "Storage",
|
"settingStorage": "Storage",
|
||||||
|
@ -421,6 +421,10 @@
|
|||||||
"@settingsSyncing": {},
|
"@settingsSyncing": {},
|
||||||
"settingsSyncingDes": "在后台更新播客",
|
"settingsSyncingDes": "在后台更新播客",
|
||||||
"@settingsSyncingDes": {},
|
"@settingsSyncingDes": {},
|
||||||
|
"settingsTapToOpenPopupMenu": "轻点打开弹出菜单",
|
||||||
|
"@settingsTapToOpenPopupMenu": {},
|
||||||
|
"settingsTapToOpenPopupMenuDes": "开启后您需长按打开节目页",
|
||||||
|
"@settingsTapToOpenPopupMenuDes": {},
|
||||||
"settingsTheme": "主题",
|
"settingsTheme": "主题",
|
||||||
"@settingsTheme": {},
|
"@settingsTheme": {},
|
||||||
"settingStorage": "储存空间",
|
"settingStorage": "储存空间",
|
||||||
|
@ -31,6 +31,7 @@ const String autoSleepTimerStartKey = 'autoSleepTimerStartKey';
|
|||||||
const String autoSleepTimerEndKey = 'autoSleepTimerEndKey';
|
const String autoSleepTimerEndKey = 'autoSleepTimerEndKey';
|
||||||
const String defaultSleepTimerKey = 'defaultSleepTimerKey';
|
const String defaultSleepTimerKey = 'defaultSleepTimerKey';
|
||||||
const String autoSleepTimerModeKey = 'autoSleepTimerModeKey';
|
const String autoSleepTimerModeKey = 'autoSleepTimerModeKey';
|
||||||
|
const String tapToOpenPopupMenuKey = 'tapToOpenPopupMenuKey';
|
||||||
|
|
||||||
class KeyValueStorage {
|
class KeyValueStorage {
|
||||||
final String key;
|
final String key;
|
||||||
|
@ -22,7 +22,11 @@ class _LayoutSettingState extends State<LayoutSetting> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _gridOptions(BuildContext context,
|
Widget _gridOptions(BuildContext context,
|
||||||
{String key, Layout layout, Layout option, double scale}) =>
|
{String key,
|
||||||
|
Layout layout,
|
||||||
|
Layout option,
|
||||||
|
double scale,
|
||||||
|
BorderRadiusGeometry borderRadius}) =>
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
|
padding: const EdgeInsets.only(top: 10.0, bottom: 10.0),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
@ -31,13 +35,17 @@ class _LayoutSettingState extends State<LayoutSetting> {
|
|||||||
await storage.saveInt(option.index);
|
await storage.saveInt(option.index);
|
||||||
setState(() {});
|
setState(() {});
|
||||||
},
|
},
|
||||||
|
borderRadius: borderRadius,
|
||||||
child: AnimatedContainer(
|
child: AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 400),
|
duration: Duration(milliseconds: 400),
|
||||||
height: 30,
|
height: 30,
|
||||||
width: 50,
|
width: 50,
|
||||||
color: layout == option
|
decoration: BoxDecoration(
|
||||||
? context.accentColor
|
borderRadius: borderRadius,
|
||||||
: context.primaryColorDark,
|
color: layout == option
|
||||||
|
? context.accentColor
|
||||||
|
: context.primaryColorDark,
|
||||||
|
),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: 10,
|
height: 10,
|
||||||
@ -62,21 +70,31 @@ class _LayoutSettingState extends State<LayoutSetting> {
|
|||||||
? Row(
|
? Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
_gridOptions(context,
|
_gridOptions(
|
||||||
key: key,
|
context,
|
||||||
layout: snapshot.data,
|
key: key,
|
||||||
option: Layout.one,
|
layout: snapshot.data,
|
||||||
scale: 4),
|
option: Layout.one,
|
||||||
_gridOptions(context,
|
scale: 4,
|
||||||
key: key,
|
borderRadius: BorderRadius.only(
|
||||||
layout: snapshot.data,
|
bottomLeft: Radius.circular(5),
|
||||||
option: Layout.two,
|
topLeft: Radius.circular(5)),
|
||||||
scale: 1),
|
),
|
||||||
|
_gridOptions(
|
||||||
|
context,
|
||||||
|
key: key,
|
||||||
|
layout: snapshot.data,
|
||||||
|
option: Layout.two,
|
||||||
|
scale: 1,
|
||||||
|
),
|
||||||
_gridOptions(context,
|
_gridOptions(context,
|
||||||
key: key,
|
key: key,
|
||||||
layout: snapshot.data,
|
layout: snapshot.data,
|
||||||
option: Layout.three,
|
option: Layout.three,
|
||||||
scale: 0),
|
scale: 0,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight: Radius.circular(5),
|
||||||
|
topRight: Radius.circular(5))),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
: Center();
|
: Center();
|
||||||
|
@ -32,13 +32,20 @@ class PlaySetting extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () => settings.setAutoSleepTimerMode = 0,
|
onTap: () => settings.setAutoSleepTimerMode = 0,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(5), topLeft: Radius.circular(5)),
|
||||||
child: Material(
|
child: Material(
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: AnimatedContainer(
|
child: AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 400),
|
duration: Duration(milliseconds: 400),
|
||||||
color: data.item1 == 0
|
decoration: BoxDecoration(
|
||||||
? context.accentColor
|
color: data.item1 == 0
|
||||||
: context.primaryColorDark,
|
? context.accentColor
|
||||||
|
: context.primaryColorDark,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(5),
|
||||||
|
topLeft: Radius.circular(5)),
|
||||||
|
),
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Text(context.s.endOfEpisode,
|
child: Text(context.s.endOfEpisode,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@ -48,13 +55,21 @@ class PlaySetting extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () => settings.setAutoSleepTimerMode = 1,
|
onTap: () => settings.setAutoSleepTimerMode = 1,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight: Radius.circular(5),
|
||||||
|
topRight: Radius.circular(5)),
|
||||||
child: Material(
|
child: Material(
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: AnimatedContainer(
|
child: AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 400),
|
duration: Duration(milliseconds: 400),
|
||||||
color: data.item1 == 1
|
decoration: BoxDecoration(
|
||||||
? context.accentColor
|
color: data.item1 == 1
|
||||||
: context.primaryColorDark,
|
? context.accentColor
|
||||||
|
: context.primaryColorDark,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight: Radius.circular(5),
|
||||||
|
topRight: Radius.circular(5)),
|
||||||
|
),
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Text(context.s.minsCount(data.item2),
|
child: Text(context.s.minsCount(data.item2),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@ -130,10 +145,17 @@ class PlaySetting extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(5), topLeft: Radius.circular(5)),
|
||||||
child: Material(
|
child: Material(
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: Container(
|
child: Container(
|
||||||
color: context.primaryColorDark,
|
decoration: BoxDecoration(
|
||||||
|
color: context.primaryColorDark,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(5),
|
||||||
|
topLeft: Radius.circular(5)),
|
||||||
|
),
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: Text(s.from(stringForMins(data.item1))),
|
child: Text(s.from(stringForMins(data.item1))),
|
||||||
),
|
),
|
||||||
@ -189,11 +211,18 @@ class PlaySetting extends StatelessWidget {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight: Radius.circular(5),
|
||||||
|
topRight: Radius.circular(5)),
|
||||||
child: Material(
|
child: Material(
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
color: Colors.black54,
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.black54,
|
||||||
|
borderRadius: BorderRadius.only(
|
||||||
|
bottomRight: Radius.circular(5),
|
||||||
|
topRight: Radius.circular(5))),
|
||||||
child: Text(s.to(stringForMins(data.item2)),
|
child: Text(s.to(stringForMins(data.item2)),
|
||||||
style: TextStyle(color: Colors.white)),
|
style: TextStyle(color: Colors.white)),
|
||||||
),
|
),
|
||||||
|
@ -21,10 +21,24 @@ class _PopupMenuSettingState extends State<PopupMenuSetting> {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> _getTapToOpenPopupMenu() async {
|
||||||
|
KeyValueStorage tapToOpenPopupMenuStorage =
|
||||||
|
KeyValueStorage(tapToOpenPopupMenuKey);
|
||||||
|
int boo = await tapToOpenPopupMenuStorage.getInt(defaultValue: 0);
|
||||||
|
return boo == 1;
|
||||||
|
}
|
||||||
|
|
||||||
_saveEpisodeMene(List<int> list) async {
|
_saveEpisodeMene(List<int> list) async {
|
||||||
KeyValueStorage popupMenuStorage = KeyValueStorage(episodePopupMenuKey);
|
KeyValueStorage popupMenuStorage = KeyValueStorage(episodePopupMenuKey);
|
||||||
await popupMenuStorage.saveMenu(list);
|
await popupMenuStorage.saveMenu(list);
|
||||||
setState(() {});
|
if (mounted) setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
|
_saveTapToOpenPopupMenu(bool boo) async {
|
||||||
|
KeyValueStorage tapToOpenPopupMenuStorage =
|
||||||
|
KeyValueStorage(tapToOpenPopupMenuKey);
|
||||||
|
await tapToOpenPopupMenuStorage.saveInt(boo ? 1 : 0);
|
||||||
|
if (mounted) setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _popupMenuItem(List<int> menu, int e,
|
Widget _popupMenuItem(List<int> menu, int e,
|
||||||
@ -116,6 +130,20 @@ class _PopupMenuSettingState extends State<PopupMenuSetting> {
|
|||||||
.bodyText1
|
.bodyText1
|
||||||
.copyWith(color: Theme.of(context).accentColor)),
|
.copyWith(color: Theme.of(context).accentColor)),
|
||||||
),
|
),
|
||||||
|
FutureBuilder<bool>(
|
||||||
|
future: _getTapToOpenPopupMenu(),
|
||||||
|
initialData: false,
|
||||||
|
builder: (context, snapshot) => ListTile(
|
||||||
|
contentPadding:
|
||||||
|
EdgeInsets.only(left: 80, top: 10, bottom: 10, right: 30),
|
||||||
|
onTap: () => _saveTapToOpenPopupMenu(!snapshot.data),
|
||||||
|
title: Text(s.settingsTapToOpenPopupMenu),
|
||||||
|
subtitle: Text(s.settingsTapToOpenPopupMenuDes),
|
||||||
|
trailing: Switch(
|
||||||
|
value: snapshot.data,
|
||||||
|
onChanged: (bool boo) => _saveTapToOpenPopupMenu(boo)),
|
||||||
|
),
|
||||||
|
),
|
||||||
FutureBuilder<List<int>>(
|
FutureBuilder<List<int>>(
|
||||||
future: _getEpisodeMenu(),
|
future: _getEpisodeMenu(),
|
||||||
initialData: [0, 1, 12, 13, 14],
|
initialData: [0, 1, 12, 13, 14],
|
||||||
|
@ -307,7 +307,7 @@ class _SettingsState extends State<Settings>
|
|||||||
MainAxisAlignment.spaceEvenly,
|
MainAxisAlignment.spaceEvenly,
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
SizedBox(width: 75),
|
SizedBox(width: 45),
|
||||||
_feedbackItem(
|
_feedbackItem(
|
||||||
LineIcons.github,
|
LineIcons.github,
|
||||||
s.feedbackGithub,
|
s.feedbackGithub,
|
||||||
|
@ -94,6 +94,8 @@ class SettingState extends ChangeNotifier {
|
|||||||
KeyValueStorage(autoSleepTimerStartKey);
|
KeyValueStorage(autoSleepTimerStartKey);
|
||||||
KeyValueStorage autoSleepTimerEndStorage =
|
KeyValueStorage autoSleepTimerEndStorage =
|
||||||
KeyValueStorage(autoSleepTimerEndKey);
|
KeyValueStorage(autoSleepTimerEndKey);
|
||||||
|
KeyValueStorage tapToOpenPopupMenuStorage =
|
||||||
|
KeyValueStorage(tapToOpenPopupMenuKey);
|
||||||
|
|
||||||
Future initData() async {
|
Future initData() async {
|
||||||
await _getTheme();
|
await _getTheme();
|
||||||
|
@ -65,13 +65,14 @@ class EpisodeGrid extends StatelessWidget {
|
|||||||
return await dbHelper.isListened(episode.enclosureUrl);
|
return await dbHelper.isListened(episode.enclosureUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Tuple4<int, bool, bool, List<int>>> _initData(
|
Future<Tuple5<int, bool, bool, bool, List<int>>> _initData(
|
||||||
EpisodeBrief episode) async {
|
EpisodeBrief episode) async {
|
||||||
List<int> menuList = await _getEpisodeMenu();
|
List<int> menuList = await _getEpisodeMenu();
|
||||||
|
bool tapToOpen = await _getTapToOpenPopupMenu();
|
||||||
int listened = await _isListened(episode);
|
int listened = await _isListened(episode);
|
||||||
bool liked = await _isLiked(episode);
|
bool liked = await _isLiked(episode);
|
||||||
bool downloaded = await _isDownloaded(episode);
|
bool downloaded = await _isDownloaded(episode);
|
||||||
return Tuple4(listened, liked, downloaded, menuList);
|
return Tuple5(listened, liked, downloaded, tapToOpen, menuList);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _isLiked(EpisodeBrief episode) async {
|
Future<bool> _isLiked(EpisodeBrief episode) async {
|
||||||
@ -90,6 +91,13 @@ class EpisodeGrid extends StatelessWidget {
|
|||||||
return await dbHelper.isDownloaded(episode.enclosureUrl);
|
return await dbHelper.isDownloaded(episode.enclosureUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<bool> _getTapToOpenPopupMenu() async {
|
||||||
|
KeyValueStorage tapToOpenPopupMenuStorage =
|
||||||
|
KeyValueStorage(tapToOpenPopupMenuKey);
|
||||||
|
int boo = await tapToOpenPopupMenuStorage.getInt(defaultValue: 0);
|
||||||
|
return boo == 1;
|
||||||
|
}
|
||||||
|
|
||||||
_markListened(EpisodeBrief episode) async {
|
_markListened(EpisodeBrief episode) async {
|
||||||
DBHelper dbHelper = DBHelper();
|
DBHelper dbHelper = DBHelper();
|
||||||
bool marked = await dbHelper.checkMarked(episode);
|
bool marked = await dbHelper.checkMarked(episode);
|
||||||
@ -140,40 +148,6 @@ class EpisodeGrid extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
//Widget _listenIndicater(BuildContext context,
|
|
||||||
// {EpisodeBrief episode, int isListened}) =>
|
|
||||||
// Center();
|
|
||||||
// Selector<AudioPlayerNotifier, Tuple2<EpisodeBrief, bool>>(
|
|
||||||
// selector: (_, audio) => Tuple2(audio.episode, audio.playerRunning),
|
|
||||||
// builder: (_, data, __) {
|
|
||||||
// return (episode.enclosureUrl == data.item1?.enclosureUrl &&
|
|
||||||
// data.item2)
|
|
||||||
// ? Container(
|
|
||||||
// height: 20,
|
|
||||||
// width: 20,
|
|
||||||
// margin: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// shape: BoxShape.circle,
|
|
||||||
// ),
|
|
||||||
// child: WaveLoader(color: context.accentColor))
|
|
||||||
// : layout != Layout.three && isListened > 0
|
|
||||||
// ? Container(
|
|
||||||
// height: 20,
|
|
||||||
// width: 20,
|
|
||||||
// margin: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// padding: EdgeInsets.all(2),
|
|
||||||
// decoration: BoxDecoration(
|
|
||||||
// color: context.accentColor,
|
|
||||||
// shape: BoxShape.circle,
|
|
||||||
// ),
|
|
||||||
// child: CustomPaint(
|
|
||||||
// painter: ListenedAllPainter(
|
|
||||||
// Colors.white,
|
|
||||||
// )),
|
|
||||||
// )
|
|
||||||
// : Center();
|
|
||||||
// });
|
|
||||||
|
|
||||||
Widget _downloadIndicater(BuildContext context,
|
Widget _downloadIndicater(BuildContext context,
|
||||||
{EpisodeBrief episode, bool isDownloaded}) =>
|
{EpisodeBrief episode, bool isDownloaded}) =>
|
||||||
showDownload || layout != Layout.three
|
showDownload || layout != Layout.three
|
||||||
@ -236,173 +210,6 @@ class EpisodeGrid extends StatelessWidget {
|
|||||||
double _width = context.width;
|
double _width = context.width;
|
||||||
var audio = Provider.of<AudioPlayerNotifier>(context, listen: false);
|
var audio = Provider.of<AudioPlayerNotifier>(context, listen: false);
|
||||||
var downloader = Provider.of<DownloadState>(context, listen: false);
|
var downloader = Provider.of<DownloadState>(context, listen: false);
|
||||||
//Offset _offset;
|
|
||||||
//_showPopupMenu(Offset offset, EpisodeBrief episode, BuildContext context,
|
|
||||||
// {bool isPlaying, bool isInPlaylist}) async {
|
|
||||||
// bool isLiked, isDownload;
|
|
||||||
// int isListened;
|
|
||||||
// var audio = Provider.of<AudioPlayerNotifier>(context, listen: false);
|
|
||||||
// var downloader = Provider.of<DownloadState>(context, listen: false);
|
|
||||||
// double left = offset.dx;
|
|
||||||
// double top = offset.dy;
|
|
||||||
// List<int> menuList = await _getEpisodeMenu();
|
|
||||||
// if (menuList.contains(3)) isListened = await _isListened(episode);
|
|
||||||
// if (menuList.contains(2)) isLiked = await _isLiked(episode);
|
|
||||||
// if (menuList.contains(4)) isDownload = await _isDownloaded(episode);
|
|
||||||
// await showMenu<int>(
|
|
||||||
// shape: RoundedRectangleBorder(
|
|
||||||
// borderRadius: BorderRadius.all(Radius.circular(10))),
|
|
||||||
// context: context,
|
|
||||||
// position: RelativeRect.fromLTRB(left, top, _width - left, 0),
|
|
||||||
// items: <PopupMenuEntry<int>>[
|
|
||||||
// PopupMenuItem(
|
|
||||||
// value: 0,
|
|
||||||
// child: Row(
|
|
||||||
// mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
// mainAxisSize: MainAxisSize.max,
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(
|
|
||||||
// LineIcons.play_circle_solid,
|
|
||||||
// color: Theme.of(context).accentColor,
|
|
||||||
// ),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// !isPlaying ? Text('Play') : Text('Playing'),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
// ),
|
|
||||||
// menuList.contains(1)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 1,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(
|
|
||||||
// LineIcons.clock_solid,
|
|
||||||
// color: Colors.cyan,
|
|
||||||
// ),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// !isInPlaylist ? Text('Later') : Text('Remove')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// menuList.contains(2)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 2,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(LineIcons.heart, color: Colors.red, size: 21),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// isLiked
|
|
||||||
// ? Text(
|
|
||||||
// 'Unlike',
|
|
||||||
// )
|
|
||||||
// : Text('Like')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// menuList.contains(3)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 3,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// SizedBox(
|
|
||||||
// width: 23,
|
|
||||||
// height: 23,
|
|
||||||
// child: CustomPaint(
|
|
||||||
// painter:
|
|
||||||
// ListenedAllPainter(Colors.blue, stroke: 1.5)),
|
|
||||||
// ),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// isListened > 0
|
|
||||||
// ? Text('Listened',
|
|
||||||
// style: TextStyle(
|
|
||||||
// color: context.textColor.withOpacity(0.5)))
|
|
||||||
// : Text('Mark\nListened')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// menuList.contains(4)
|
|
||||||
// ? PopupMenuItem(
|
|
||||||
// value: 4,
|
|
||||||
// child: Row(
|
|
||||||
// children: <Widget>[
|
|
||||||
// Icon(LineIcons.download_solid, color: Colors.green),
|
|
||||||
// Padding(
|
|
||||||
// padding: EdgeInsets.symmetric(horizontal: 2),
|
|
||||||
// ),
|
|
||||||
// isDownload
|
|
||||||
// ? Text('Downloaded',
|
|
||||||
// style: TextStyle(
|
|
||||||
// color: context.textColor.withOpacity(0.5)))
|
|
||||||
// : Text('Download')
|
|
||||||
// ],
|
|
||||||
// ))
|
|
||||||
// : null,
|
|
||||||
// ],
|
|
||||||
// elevation: 5.0,
|
|
||||||
// ).then((value) async {
|
|
||||||
// switch (value) {
|
|
||||||
// case 0:
|
|
||||||
// if (!isPlaying) audio.episodeLoad(episode);
|
|
||||||
// break;
|
|
||||||
// case 1:
|
|
||||||
// if (!isInPlaylist) {
|
|
||||||
// audio.addToPlaylist(episode);
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Added to playlist',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// audio.delFromPlaylist(episode);
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Removed from playlist',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case 2:
|
|
||||||
// if (isLiked) {
|
|
||||||
// await _setUnliked(episode.enclosureUrl);
|
|
||||||
// audio.setEpisodeState = true;
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Unliked',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// } else {
|
|
||||||
// await _saveLiked(episode.enclosureUrl);
|
|
||||||
// audio.setEpisodeState = true;
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Liked',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case 3:
|
|
||||||
// if (isListened < 1) {
|
|
||||||
// await _markListened(episode);
|
|
||||||
// audio.setEpisodeState = true;
|
|
||||||
// Fluttertoast.showToast(
|
|
||||||
// msg: 'Mark listened',
|
|
||||||
// gravity: ToastGravity.BOTTOM,
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
// case 4:
|
|
||||||
// if (!isDownload) downloader.startTask(episode);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
//}
|
|
||||||
|
|
||||||
final options = LiveOptions(
|
final options = LiveOptions(
|
||||||
delay: Duration.zero,
|
delay: Duration.zero,
|
||||||
showItemInterval: Duration(milliseconds: 50),
|
showItemInterval: Duration(milliseconds: 50),
|
||||||
@ -443,14 +250,15 @@ class EpisodeGrid extends StatelessWidget {
|
|||||||
builder: (_, data, __) => OpenContainerWrapper(
|
builder: (_, data, __) => OpenContainerWrapper(
|
||||||
episode: episodes[index],
|
episode: episodes[index],
|
||||||
closedBuilder: (context, action, boo) => FutureBuilder<
|
closedBuilder: (context, action, boo) => FutureBuilder<
|
||||||
Tuple4<int, bool, bool, List<int>>>(
|
Tuple5<int, bool, bool, bool, List<int>>>(
|
||||||
future: _initData(episodes[index]),
|
future: _initData(episodes[index]),
|
||||||
initialData: Tuple4(0, false, false, []),
|
initialData: Tuple5(0, false, false, false, []),
|
||||||
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
||||||
int isListened = snapshot.data.item1;
|
int isListened = snapshot.data.item1;
|
||||||
bool isLiked = snapshot.data.item2;
|
bool isLiked = snapshot.data.item2;
|
||||||
bool isDownloaded = snapshot.data.item3;
|
bool isDownloaded = snapshot.data.item3;
|
||||||
List<int> menuList = snapshot.data.item4;
|
bool tapToOpen = snapshot.data.item4;
|
||||||
|
List<int> menuList = snapshot.data.item5;
|
||||||
return Container(
|
return Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius:
|
borderRadius:
|
||||||
@ -489,7 +297,8 @@ class EpisodeGrid extends StatelessWidget {
|
|||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.all(Radius.circular(15.0))),
|
BorderRadius.all(Radius.circular(15.0))),
|
||||||
duration: Duration(milliseconds: 100),
|
duration: Duration(milliseconds: 100),
|
||||||
tapMode: TapMode.onTap,
|
tapMode:
|
||||||
|
tapToOpen ? TapMode.onTap : TapMode.onLongPress,
|
||||||
animateMenuItems: false,
|
animateMenuItems: false,
|
||||||
blurBackgroundColor:
|
blurBackgroundColor:
|
||||||
context.brightness == Brightness.light
|
context.brightness == Brightness.light
|
||||||
|
Loading…
x
Reference in New Issue
Block a user