tsacdop-podcast-app-android/lib/settings/play_setting.dart

431 lines
19 KiB
Dart
Raw Normal View History

2020-06-27 20:27:39 +02:00
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
2020-07-26 12:20:42 +02:00
import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
2020-06-27 20:27:39 +02:00
import 'package:tuple/tuple.dart';
import '../home/audioplayer.dart';
2020-08-09 21:35:04 +02:00
import '../state/audio_state.dart';
2020-07-26 12:20:42 +02:00
import '../state/setting_state.dart';
import '../util/custom_dropdown.dart';
2020-08-11 10:35:51 +02:00
import '../util/custom_time_picker.dart';
2020-07-26 12:20:42 +02:00
import '../util/extension_helper.dart';
2020-08-27 10:36:18 +02:00
const List secondsToSelect = [5, 10, 15, 20, 25, 30, 45, 60];
class PlaySetting extends StatelessWidget {
2020-08-09 21:35:04 +02:00
String _volumeEffect(BuildContext context, int i) {
final s = context.s;
if (i == 2000) {
return s.playerHeightShort;
} else if (i == 3000) {
return s.playerHeightMed;
}
return s.playerHeightTall;
}
2020-06-27 20:27:39 +02:00
Widget _modeWidget(BuildContext context) {
var settings = Provider.of<SettingState>(context, listen: false);
return Selector<SettingState, Tuple2<int, int>>(
selector: (_, settings) =>
Tuple2(settings.autoSleepTimerMode, settings.defaultSleepTimer),
builder: (_, data, __) => Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
InkWell(
onTap: () => settings.setAutoSleepTimerMode = 0,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(5), topLeft: Radius.circular(5)),
2020-06-27 20:27:39 +02:00
child: Material(
color: Colors.transparent,
child: AnimatedContainer(
duration: Duration(milliseconds: 400),
decoration: BoxDecoration(
color: data.item1 == 0
? context.accentColor
: context.primaryColorDark,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(5),
topLeft: Radius.circular(5)),
),
2020-06-27 20:27:39 +02:00
padding: const EdgeInsets.all(8.0),
2020-07-06 11:50:20 +02:00
child: Text(context.s.endOfEpisode,
2020-06-27 20:27:39 +02:00
style: TextStyle(
color: data.item1 == 0 ? Colors.white : null)),
),
),
),
InkWell(
onTap: () => settings.setAutoSleepTimerMode = 1,
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(5),
topRight: Radius.circular(5)),
2020-06-27 20:27:39 +02:00
child: Material(
color: Colors.transparent,
child: AnimatedContainer(
duration: Duration(milliseconds: 400),
decoration: BoxDecoration(
color: data.item1 == 1
? context.accentColor
: context.primaryColorDark,
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(5),
topRight: Radius.circular(5)),
),
2020-06-27 20:27:39 +02:00
padding: const EdgeInsets.all(8.0),
2020-07-06 11:50:20 +02:00
child: Text(context.s.minsCount(data.item2),
2020-06-27 20:27:39 +02:00
style: TextStyle(
color: data.item1 == 1 ? Colors.white : null)),
),
),
),
],
),
),
);
}
Widget _scheduleWidget(BuildContext context) {
var settings = Provider.of<SettingState>(context, listen: false);
2020-07-06 11:50:20 +02:00
final s = context.s;
2020-06-27 20:27:39 +02:00
return Selector<SettingState, Tuple2<int, int>>(
selector: (_, settings) =>
Tuple2(settings.autoSleepTimerStart, settings.autoSleepTimerEnd),
builder: (_, data, __) => Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
InkWell(
2020-08-11 10:35:51 +02:00
onTap: () async {
2020-07-26 12:20:42 +02:00
var startTime = data.item1;
2020-08-11 10:35:51 +02:00
final timeOfDay = await showCustomTimePicker(
context: context,
cancelText: s.cancel,
confirmText: s.confirm,
helpText: '',
initialTime: TimeOfDay(
hour: startTime ~/ 60, minute: startTime % 60));
if (timeOfDay != null) {
startTime = timeOfDay.hour * 60 + timeOfDay.minute;
if (startTime != data.item2) {
settings.setAutoSleepTimerStart = startTime;
} else {
Fluttertoast.showToast(
msg: s.toastTimeEqualEnd,
gravity: ToastGravity.BOTTOM,
);
}
}
2020-06-27 20:27:39 +02:00
},
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(5), topLeft: Radius.circular(5)),
2020-06-27 20:27:39 +02:00
child: Material(
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: context.primaryColorDark,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(5),
topLeft: Radius.circular(5)),
),
2020-06-27 20:27:39 +02:00
padding: const EdgeInsets.all(8.0),
child: Text(s.from(data.item1.toTime)),
2020-06-27 20:27:39 +02:00
),
),
),
InkWell(
2020-08-11 10:35:51 +02:00
onTap: () async {
var endTime = data.item2;
final timeOfDay = await showCustomTimePicker(
context: context,
cancelText: s.cancel,
confirmText: s.confirm,
helpText: '',
initialTime:
TimeOfDay(hour: endTime ~/ 60, minute: endTime % 60));
if (timeOfDay != null) {
endTime = timeOfDay.hour * 60 + timeOfDay.minute;
if (endTime != data.item1) {
settings.setAutoSleepTimerEnd = endTime;
} else {
Fluttertoast.showToast(
msg: s.toastTimeEqualStart,
gravity: ToastGravity.BOTTOM,
);
}
}
2020-06-27 20:27:39 +02:00
},
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(5),
topRight: Radius.circular(5)),
2020-06-27 20:27:39 +02:00
child: Material(
color: Colors.transparent,
child: Container(
padding: const EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Colors.black54,
borderRadius: BorderRadius.only(
bottomRight: Radius.circular(5),
topRight: Radius.circular(5))),
child: Text(s.to(data.item2.toTime),
2020-06-27 20:27:39 +02:00
style: TextStyle(color: Colors.white)),
),
),
),
],
),
),
);
}
@override
Widget build(BuildContext context) {
2020-08-09 21:35:04 +02:00
var settings = context.watch<SettingState>();
var audio = context.watch<AudioPlayerNotifier>();
2020-07-02 14:58:55 +02:00
final s = context.s;
return AnnotatedRegion<SystemUiOverlayStyle>(
value: SystemUiOverlayStyle(
statusBarIconBrightness: Theme.of(context).accentColorBrightness,
systemNavigationBarColor: Theme.of(context).primaryColor,
systemNavigationBarIconBrightness:
Theme.of(context).accentColorBrightness,
),
child: Scaffold(
appBar: AppBar(
2020-07-02 14:58:55 +02:00
title: Text(s.play),
elevation: 0,
backgroundColor: Theme.of(context).primaryColor,
),
body: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
2020-06-27 20:27:39 +02:00
padding: const EdgeInsets.all(10.0),
),
Container(
height: 30.0,
2020-06-12 19:56:13 +02:00
padding: EdgeInsets.symmetric(horizontal: 70),
alignment: Alignment.centerLeft,
2020-07-02 14:58:55 +02:00
child: Text(s.homeMenuPlaylist,
style: Theme.of(context)
.textTheme
.bodyText1
.copyWith(color: Theme.of(context).accentColor)),
),
ListView(
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: <Widget>[
2020-06-27 20:27:39 +02:00
Selector<SettingState, bool>(
selector: (_, settings) => settings.autoPlay,
builder: (_, data, __) => ListTile(
onTap: () => settings.setAutoPlay = !data,
2020-08-01 17:10:43 +02:00
contentPadding: EdgeInsets.only(
left: 70.0, right: 20, bottom: 10),
2020-07-06 11:50:20 +02:00
title: Text(s.settingsMenuAutoPlay),
2020-07-02 14:58:55 +02:00
subtitle: Text(s.settingsAutoPlayDes),
2020-06-27 20:27:39 +02:00
trailing: Transform.scale(
scale: 0.9,
child: Switch(
value: data,
2020-06-27 20:27:39 +02:00
onChanged: (boo) => settings.setAutoPlay = boo),
),
),
),
2020-08-15 19:43:45 +02:00
Divider(height: 1),
2020-06-27 20:27:39 +02:00
],
),
Padding(
padding: const EdgeInsets.all(10.0),
),
Container(
height: 30.0,
padding: EdgeInsets.symmetric(horizontal: 70),
alignment: Alignment.centerLeft,
child: Text(s.playback,
style: Theme.of(context)
.textTheme
.bodyText1
.copyWith(color: Theme.of(context).accentColor)),
),
ListView(
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: <Widget>[
ListTile(
contentPadding: EdgeInsets.only(
2020-08-01 17:10:43 +02:00
left: 70.0, right: 20, bottom: 10, top: 10),
title: Text(s.settingsFastForwardSec),
subtitle: Text(s.settingsFastForwardSecDes),
trailing: Selector<SettingState, int>(
selector: (_, settings) =>
settings.fastForwardSeconds,
builder: (_, data, __) => MyDropdownButton(
hint: Text(s.secCount(data)),
underline: Center(),
elevation: 1,
displayItemCount: 5,
isDense: true,
value: data,
2020-07-26 12:20:42 +02:00
onChanged: (value) =>
settings.setFastForwardSeconds = value,
items: secondsToSelect
.map<DropdownMenuItem<int>>((e) {
return DropdownMenuItem<int>(
value: e, child: Text(s.secCount(e)));
}).toList()),
),
),
ListTile(
contentPadding: EdgeInsets.only(
2020-08-01 17:10:43 +02:00
left: 70.0, right: 20, bottom: 10, top: 10),
title: Text(s.settingsRewindSec),
subtitle: Text(s.settingsRewindSecDes),
trailing: Selector<SettingState, int>(
selector: (_, settings) => settings.rewindSeconds,
builder: (_, data, __) => MyDropdownButton(
hint: Text(s.secCount(data)),
underline: Center(),
elevation: 1,
displayItemCount: 5,
isDense: true,
value: data,
2020-07-26 12:20:42 +02:00
onChanged: (value) =>
settings.setRewindSeconds = value,
items: secondsToSelect
.map<DropdownMenuItem<int>>((e) {
return DropdownMenuItem<int>(
value: e, child: Text(s.secCount(e)));
}).toList()),
),
),
2020-08-09 21:35:04 +02:00
ListTile(
contentPadding: EdgeInsets.only(
left: 70.0, right: 20, bottom: 10, top: 10),
title: Text(s.settingsBoostVolume),
subtitle: Text(s.settingsBoostVolumeDes),
trailing: Selector<AudioPlayerNotifier, int>(
selector: (_, audio) => audio.volumeGain,
builder: (_, volumeGain, __) => MyDropdownButton(
hint: Text(_volumeEffect(context, volumeGain)),
underline: Center(),
elevation: 1,
displayItemCount: 5,
isDense: true,
value: volumeGain,
onChanged: (value) =>
audio.setVolumeGain = value,
items: [2000, 3000, 4000]
.map<DropdownMenuItem<int>>((e) {
return DropdownMenuItem<int>(
value: e,
child: Text(_volumeEffect(context, e)));
}).toList()),
),
),
Divider(),
]),
Padding(
padding: const EdgeInsets.all(10.0),
),
2020-06-27 20:27:39 +02:00
Container(
height: 30.0,
padding: EdgeInsets.symmetric(horizontal: 70),
alignment: Alignment.centerLeft,
2020-07-02 14:58:55 +02:00
child: Text(s.sleepTimer,
style: context.textTheme.bodyText1
2020-06-27 20:27:39 +02:00
.copyWith(color: Theme.of(context).accentColor)),
),
ListView(
physics: const BouncingScrollPhysics(),
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: <Widget>[
ListTile(
2020-08-01 17:10:43 +02:00
contentPadding: EdgeInsets.only(left: 70.0, right: 20),
2020-07-02 14:58:55 +02:00
title: Text(s.settingsSTDefaultTime),
subtitle: Text(s.settingsSTDefautTimeDes),
2020-06-27 20:27:39 +02:00
trailing: Selector<SettingState, int>(
selector: (_, settings) => settings.defaultSleepTimer,
builder: (_, data, __) => MyDropdownButton(
2020-07-06 11:50:20 +02:00
hint: Text(s.minsCount(data)),
2020-06-27 20:27:39 +02:00
underline: Center(),
elevation: 1,
displayItemCount: 5,
2020-06-27 20:27:39 +02:00
isDense: true,
value: data,
2020-07-26 12:20:42 +02:00
onChanged: (value) =>
2020-06-27 20:27:39 +02:00
settings.setDefaultSleepTimer = value,
items:
2020-07-30 19:18:56 +02:00
kMinsToSelect.map<DropdownMenuItem<int>>((e) {
2020-06-27 20:27:39 +02:00
return DropdownMenuItem<int>(
2020-07-06 11:50:20 +02:00
value: e, child: Text(s.minsCount(e)));
2020-06-27 20:27:39 +02:00
}).toList()),
),
),
Selector<SettingState, bool>(
selector: (_, settings) => settings.autoSleepTimer,
builder: (_, data, __) => ListTile(
onTap: () => settings.setAutoSleepTimer = !data,
contentPadding: const EdgeInsets.only(
2020-08-01 17:10:43 +02:00
left: 70.0, right: 20.0, bottom: 10.0, top: 10.0),
2020-07-02 14:58:55 +02:00
title: Text(s.settingsSTAuto),
subtitle: Text(s.settingsSTAutoDes),
2020-06-27 20:27:39 +02:00
trailing: Transform.scale(
scale: 0.9,
child: Switch(
value: data,
onChanged: (boo) =>
settings.setAutoSleepTimer = boo),
),
),
),
ListTile(
contentPadding: const EdgeInsets.only(
2020-08-01 17:10:43 +02:00
left: 70.0, right: 20.0, bottom: 10.0, top: 10.0),
2020-07-02 14:58:55 +02:00
title: Text(s.settingsSTMode),
2020-06-27 20:27:39 +02:00
subtitle:
context.width > 360 ? null : _modeWidget(context),
trailing: context.width > 360
? _modeWidget(context)
: null),
ListTile(
contentPadding:
2020-08-01 17:10:43 +02:00
EdgeInsets.only(left: 70.0, right: 20),
2020-07-02 14:58:55 +02:00
title: Text(s.schedule),
2020-06-27 20:27:39 +02:00
subtitle: context.width > 360
? null
: _scheduleWidget(context),
trailing: context.width > 360
? _scheduleWidget(context)
: null),
2020-08-15 19:43:45 +02:00
Divider(height: 1)
],
),
SizedBox(height: 20)
],
),
],
),
),
),
);
}
}