new file: lib/class/settingstate.dart
modified: lib/class/sqflite_localpodcast.dart modified: lib/episodes/episodedetail.dart modified: lib/home/appbar/importompl.dart modified: lib/home/appbar/popupmenu.dart modified: lib/home/home.dart modified: lib/home/homescroll.dart modified: lib/main.dart modified: lib/podcasts/podcastlist.dart new file: lib/podcasts/podcastmanage.dart modified: lib/util/episodegrid.dart modified: pubspec.lock modified: pubspec.yaml Add: reorder podcasts
This commit is contained in:
parent
3200eeacd7
commit
d3efce463c
|
@ -0,0 +1,19 @@
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
|
||||||
|
enum Setting {start, stop}
|
||||||
|
class SettingState extends ChangeNotifier{
|
||||||
|
Setting _subscribeupdate;
|
||||||
|
Setting get subscribeupdate => _subscribeupdate;
|
||||||
|
set subscribeUpdate(Setting s){
|
||||||
|
_subscribeupdate = s;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
Setting _themeupdate;
|
||||||
|
Setting get themeUpdate => _themeupdate;
|
||||||
|
set themeUpdate(Setting s){
|
||||||
|
_themeupdate = s;
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -27,19 +27,38 @@ class DBHelper {
|
||||||
void _onCreate(Database db, int version) async {
|
void _onCreate(Database db, int version) async {
|
||||||
await db.execute(
|
await db.execute(
|
||||||
"""CREATE TABLE PodcastLocal(id INTEGER PRIMARY KEY,title TEXT,
|
"""CREATE TABLE PodcastLocal(id INTEGER PRIMARY KEY,title TEXT,
|
||||||
imageUrl TEXT,rssUrl TEXT UNIQUE,primaryColor TEXT,author TEXT, description TEXT, add_date INTEGER)""");
|
imageUrl TEXT,rssUrl TEXT UNIQUE,primaryColor TEXT,author TEXT,
|
||||||
|
description TEXT, add_date INTEGER, order_id INTEGER default 0)""");
|
||||||
await db
|
await db
|
||||||
.execute("""CREATE TABLE Episodes(id INTEGER PRIMARY KEY,title TEXT,
|
.execute("""CREATE TABLE Episodes(id INTEGER PRIMARY KEY,title TEXT,
|
||||||
enclosure_url TEXT UNIQUE, enclosure_length INTEGER, pubDate TEXT,
|
enclosure_url TEXT UNIQUE, enclosure_length INTEGER, pubDate TEXT,
|
||||||
description TEXT, feed_title TEXT, feed_link TEXT, milliseconds INTEGER,
|
description TEXT, feed_title TEXT, feed_link TEXT, milliseconds INTEGER,
|
||||||
duration INTEGER DEFAULT 0, explicit INTEGER DEFAULT 0, liked INTEGER DEFAULT 0,
|
duration INTEGER DEFAULT 0, explicit INTEGER DEFAULT 0, liked INTEGER DEFAULT 0,
|
||||||
downloaded TEXT DEFAULT 'ND', download_date INTEGER DEFAULT 0)""");
|
downloaded TEXT DEFAULT 'ND', download_date INTEGER DEFAULT 0)""");
|
||||||
|
await db.execute(
|
||||||
|
"""CREATE TABLE Setting(id INTEGER PRIMARY KEY, setting TEXT, setting_value INTEGER DEFAULT 0)""");
|
||||||
|
await db
|
||||||
|
.execute("""INSERT INTO Setting (setting) VALUES('podcasts_order') """);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<PodcastLocal>> getPodcastLocal() async {
|
Future<List<PodcastLocal>> getPodcastLocal() async {
|
||||||
var dbClient = await database;
|
var dbClient = await database;
|
||||||
List<Map> list = await dbClient.rawQuery(
|
//query podcasts order setting
|
||||||
|
List<Map> setting = await dbClient.rawQuery("SELECT setting_value FROM Setting WHERE setting = 'podcasts_order'");
|
||||||
|
int podcastsOrder = setting.first['setting_value'];
|
||||||
|
List<Map> list;
|
||||||
|
if (podcastsOrder == 0)
|
||||||
|
{ list = await dbClient.rawQuery(
|
||||||
'SELECT title, imageUrl, rssUrl, primaryColor, author FROM PodcastLocal ORDER BY add_date DESC');
|
'SELECT title, imageUrl, rssUrl, primaryColor, author FROM PodcastLocal ORDER BY add_date DESC');
|
||||||
|
print('Get podcasts list Ordered by 0');}
|
||||||
|
else if (podcastsOrder == 1)
|
||||||
|
{ list = await dbClient.rawQuery(
|
||||||
|
'SELECT title, imageUrl, rssUrl, primaryColor, author FROM PodcastLocal ORDER BY add_date');}
|
||||||
|
else if (podcastsOrder ==2)
|
||||||
|
{ list = await dbClient.rawQuery(
|
||||||
|
'SELECT title, imageUrl, rssUrl, primaryColor, author FROM PodcastLocal ORDER BY order_id');
|
||||||
|
print('Get podcasts list Ordered by 2');}
|
||||||
|
|
||||||
List<PodcastLocal> podcastLocal = List();
|
List<PodcastLocal> podcastLocal = List();
|
||||||
for (int i = 0; i < list.length; i++) {
|
for (int i = 0; i < list.length; i++) {
|
||||||
podcastLocal.add(PodcastLocal(
|
podcastLocal.add(PodcastLocal(
|
||||||
|
@ -50,12 +69,32 @@ class DBHelper {
|
||||||
list[i]['author'],
|
list[i]['author'],
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
print(podcastLocal.length);
|
|
||||||
return podcastLocal;
|
return podcastLocal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//save podcast order adter user save
|
||||||
|
saveOrder(List<PodcastLocal> podcastList) async {
|
||||||
|
var dbClient = await database;
|
||||||
|
for (int i = 0; i < podcastList.length; i++){
|
||||||
|
await dbClient.rawUpdate(
|
||||||
|
"UPDATE OR IGNORE PodcastLocal SET order_id = ? WHERE title = ?",
|
||||||
|
[i, podcastList[i].title]);
|
||||||
|
print(podcastList[i].title);
|
||||||
|
}
|
||||||
|
await dbClient.rawUpdate(
|
||||||
|
"UPDATE OR IGNORE Setting SET setting_value = 2 WHERE setting = 'podcasts_order' ");
|
||||||
|
print('Changed order');
|
||||||
|
}
|
||||||
|
|
||||||
|
updateOrderSetting(int value) async{
|
||||||
|
var dbClient = await database;
|
||||||
|
await dbClient.rawUpdate(
|
||||||
|
"UPDATE OR IGNORE Setting SET setting_value = ? WHERE setting = 'podcasts_order'",[value]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Future savePodcastLocal(PodcastLocal podcastLocal) async {
|
Future savePodcastLocal(PodcastLocal podcastLocal) async {
|
||||||
print('save');
|
print('podcast saved in sqllite');
|
||||||
int _milliseconds = DateTime.now().millisecondsSinceEpoch;
|
int _milliseconds = DateTime.now().millisecondsSinceEpoch;
|
||||||
var dbClient = await database;
|
var dbClient = await database;
|
||||||
await dbClient.transaction((txn) async {
|
await dbClient.transaction((txn) async {
|
||||||
|
@ -106,10 +145,10 @@ class DBHelper {
|
||||||
try {
|
try {
|
||||||
date = DateFormat('EEE, dd MMM yyyy HH:mm:ss Z', 'en_US').parse(pubDate);
|
date = DateFormat('EEE, dd MMM yyyy HH:mm:ss Z', 'en_US').parse(pubDate);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
try{
|
try {
|
||||||
print('e');
|
print('e');
|
||||||
date = DateFormat('dd MMM yyyy HH:mm:ss Z', 'en_US').parse(pubDate);}
|
date = DateFormat('dd MMM yyyy HH:mm:ss Z', 'en_US').parse(pubDate);
|
||||||
catch(e) {
|
} catch (e) {
|
||||||
print('e');
|
print('e');
|
||||||
date = DateTime(0);
|
date = DateTime(0);
|
||||||
}
|
}
|
||||||
|
@ -162,9 +201,9 @@ class DBHelper {
|
||||||
final _pubDate = _p.items[i].pubDate;
|
final _pubDate = _p.items[i].pubDate;
|
||||||
final _date = _parsePubDate(_pubDate);
|
final _date = _parsePubDate(_pubDate);
|
||||||
final _milliseconds = _date.millisecondsSinceEpoch;
|
final _milliseconds = _date.millisecondsSinceEpoch;
|
||||||
(_p.items[i].itunes.duration != null )
|
(_p.items[i].itunes.duration != null)
|
||||||
? _duration = _p.items[i].itunes.duration.inMinutes
|
? _duration = _p.items[i].itunes.duration.inMinutes
|
||||||
: _duration = 0;
|
: _duration = 0;
|
||||||
final _explicit = getExplicit(_p.items[i].itunes.explicit);
|
final _explicit = getExplicit(_p.items[i].itunes.explicit);
|
||||||
if (_p.items[i].enclosure.url != null) {
|
if (_p.items[i].enclosure.url != null) {
|
||||||
await dbClient.transaction((txn) {
|
await dbClient.transaction((txn) {
|
||||||
|
@ -213,8 +252,7 @@ class DBHelper {
|
||||||
list[x]['duration'],
|
list[x]['duration'],
|
||||||
list[x]['explicit']));
|
list[x]['explicit']));
|
||||||
}
|
}
|
||||||
print(episodes.length);
|
print('Loaded' + title);
|
||||||
print(title);
|
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -242,7 +280,6 @@ class DBHelper {
|
||||||
list[x]['duration'],
|
list[x]['duration'],
|
||||||
list[x]['explicit']));
|
list[x]['explicit']));
|
||||||
}
|
}
|
||||||
print(episodes.length);
|
|
||||||
print(title);
|
print(title);
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
@ -297,7 +334,6 @@ class DBHelper {
|
||||||
list[x]['duration'],
|
list[x]['duration'],
|
||||||
list[x]['explicit']));
|
list[x]['explicit']));
|
||||||
}
|
}
|
||||||
print(episodes.length);
|
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -323,7 +359,6 @@ class DBHelper {
|
||||||
list[x]['duration'],
|
list[x]['duration'],
|
||||||
list[x]['explicit']));
|
list[x]['explicit']));
|
||||||
}
|
}
|
||||||
print(episodes.length);
|
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,7 +418,6 @@ class DBHelper {
|
||||||
list[x]['duration'],
|
list[x]['duration'],
|
||||||
list[x]['explicit']));
|
list[x]['explicit']));
|
||||||
}
|
}
|
||||||
print(episodes.length);
|
|
||||||
return episodes;
|
return episodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,26 +437,26 @@ class DBHelper {
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<EpisodeBrief> getRssItemWithUrl(String url) async {
|
Future<EpisodeBrief> getRssItemWithUrl(String url) async {
|
||||||
var dbClient = await database;
|
var dbClient = await database;
|
||||||
EpisodeBrief episode;
|
EpisodeBrief episode;
|
||||||
List<Map> list = await dbClient.rawQuery(
|
List<Map> list = await dbClient.rawQuery(
|
||||||
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.pubDate,
|
"""SELECT E.title, E.enclosure_url, E.enclosure_length, E.pubDate,
|
||||||
E.feed_title, E.duration, E.explicit, E.liked, E.downloaded, P.imageUrl,
|
E.feed_title, E.duration, E.explicit, E.liked, E.downloaded, P.imageUrl,
|
||||||
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_title = P.title
|
P.primaryColor FROM Episodes E INNER JOIN PodcastLocal P ON E.feed_title = P.title
|
||||||
WHERE E.enclosure_url = ?""",[url]);
|
WHERE E.enclosure_url = ?""", [url]);
|
||||||
episode = EpisodeBrief(
|
episode = EpisodeBrief(
|
||||||
list.first['title'],
|
list.first['title'],
|
||||||
list.first['enclosure_url'],
|
list.first['enclosure_url'],
|
||||||
list.first['enclosure_length'],
|
list.first['enclosure_length'],
|
||||||
list.first['pubDate'],
|
list.first['pubDate'],
|
||||||
list.first['feed_title'],
|
list.first['feed_title'],
|
||||||
list.first['imageUrl'],
|
list.first['imageUrl'],
|
||||||
list.first['primaryColor'],
|
list.first['primaryColor'],
|
||||||
list.first['liked'],
|
list.first['liked'],
|
||||||
list.first['downloaded'],
|
list.first['downloaded'],
|
||||||
list.first['duration'],
|
list.first['duration'],
|
||||||
list.first['explicit']);
|
list.first['explicit']);
|
||||||
return episode;
|
return episode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,14 +293,16 @@ class _MenuBarState extends State<MenuBar> {
|
||||||
urlChange.feedTitle = widget.episodeItem.feedTitle;
|
urlChange.feedTitle = widget.episodeItem.feedTitle;
|
||||||
urlChange.primaryColor =
|
urlChange.primaryColor =
|
||||||
widget.episodeItem.primaryColor;
|
widget.episodeItem.primaryColor;
|
||||||
print('Playing');
|
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
|
alignment: Alignment.center,
|
||||||
height: 50.0,
|
height: 50.0,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 20.0),
|
padding: EdgeInsets.symmetric(horizontal: 20.0),
|
||||||
child: Icon(
|
child:Row(
|
||||||
Icons.play_arrow,
|
children: <Widget>[
|
||||||
color: Colors.grey[700],
|
Text('Play Now', style: TextStyle(color: Colors.blue, fontSize: 15, fontWeight: FontWeight.bold,)),
|
||||||
|
Icon(Icons.play_arrow, color: Colors.blue,),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -308,13 +310,13 @@ class _MenuBarState extends State<MenuBar> {
|
||||||
: (widget.episodeItem.title == urlchange.title &&
|
: (widget.episodeItem.title == urlchange.title &&
|
||||||
urlchange.audioState == AudioState.play)
|
urlchange.audioState == AudioState.play)
|
||||||
? Container(
|
? Container(
|
||||||
padding: EdgeInsets.only(right: 15),
|
padding: EdgeInsets.only(right: 30),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: 15, height: 15, child: WaveLoader()))
|
width: 20, height: 15, child: WaveLoader()))
|
||||||
: Container(
|
: Container(
|
||||||
padding: EdgeInsets.only(right: 15),
|
padding: EdgeInsets.only(right: 30),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: 15,
|
width: 20,
|
||||||
height: 15,
|
height: 15,
|
||||||
child: LineLoader(),
|
child: LineLoader(),
|
||||||
),
|
),
|
||||||
|
|
|
@ -46,7 +46,8 @@ class Import extends StatelessWidget {
|
||||||
height: 20.0,
|
height: 20.0,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 20.0),
|
padding: EdgeInsets.symmetric(horizontal: 20.0),
|
||||||
alignment: Alignment.centerLeft,
|
alignment: Alignment.centerLeft,
|
||||||
child: Text('Fetch data: ' + (importOmpl.rsstitle)),
|
child:
|
||||||
|
Text('Fetch data: ' + (importOmpl.rsstitle)),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -90,7 +90,7 @@ class PopupMenu extends StatelessWidget {
|
||||||
|
|
||||||
await dbHelper.savePodcastRss(_p);
|
await dbHelper.savePodcastRss(_p);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(e);
|
importOmpl.importState = ImportState.error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +114,6 @@ class PopupMenu extends StatelessWidget {
|
||||||
importOmpl.importState = ImportState.stop;
|
importOmpl.importState = ImportState.stop;
|
||||||
print('Import fisnished');
|
print('Import fisnished');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print(e);
|
|
||||||
importOmpl.importState = ImportState.error;
|
importOmpl.importState = ImportState.error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import 'package:tsacdop/home/appbar/importompl.dart';
|
||||||
import 'package:tsacdop/home/audio_player.dart';
|
import 'package:tsacdop/home/audio_player.dart';
|
||||||
import 'homescroll.dart';
|
import 'homescroll.dart';
|
||||||
import 'package:tsacdop/util/pageroute.dart';
|
import 'package:tsacdop/util/pageroute.dart';
|
||||||
|
import 'package:tsacdop/podcasts/podcastmanage.dart';
|
||||||
|
|
||||||
class Home extends StatelessWidget {
|
class Home extends StatelessWidget {
|
||||||
|
|
||||||
|
@ -26,7 +27,7 @@ class Home extends StatelessWidget {
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
SlideLeftRoute(page: Podcast()),
|
SlideLeftRoute(page: PodcastManage()),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Container(
|
child: Container(
|
||||||
|
|
|
@ -14,7 +14,9 @@ import 'package:tsacdop/class/sqflite_localpodcast.dart';
|
||||||
|
|
||||||
import 'package:tsacdop/episodes/episodedetail.dart';
|
import 'package:tsacdop/episodes/episodedetail.dart';
|
||||||
import 'package:tsacdop/podcasts/podcastdetail.dart';
|
import 'package:tsacdop/podcasts/podcastdetail.dart';
|
||||||
|
import 'package:tsacdop/podcasts/podcastlist.dart';
|
||||||
import 'package:tsacdop/util/pageroute.dart';
|
import 'package:tsacdop/util/pageroute.dart';
|
||||||
|
import 'package:tsacdop/class/settingstate.dart';
|
||||||
|
|
||||||
class ScrollPodcasts extends StatefulWidget {
|
class ScrollPodcasts extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
|
@ -23,31 +25,50 @@ class ScrollPodcasts extends StatefulWidget {
|
||||||
|
|
||||||
class _ScrollPodcastsState extends State<ScrollPodcasts> {
|
class _ScrollPodcastsState extends State<ScrollPodcasts> {
|
||||||
var dir;
|
var dir;
|
||||||
Future<List<PodcastLocal>> getPodcastLocal() async {
|
bool _loading;
|
||||||
|
List<PodcastLocal> podcastList;
|
||||||
|
|
||||||
|
getPodcastLocal() async {
|
||||||
var dbHelper = DBHelper();
|
var dbHelper = DBHelper();
|
||||||
List<PodcastLocal> podcastList = await dbHelper.getPodcastLocal();
|
podcastList = await dbHelper.getPodcastLocal();
|
||||||
dir = await getApplicationDocumentsDirectory();
|
dir = await getApplicationDocumentsDirectory();
|
||||||
return podcastList;
|
setState(() {
|
||||||
|
_loading = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
ImportState importState;
|
ImportState importState;
|
||||||
didChangeDependencies() {
|
Setting subscribeUpdate;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didChangeDependencies() {
|
||||||
super.didChangeDependencies();
|
super.didChangeDependencies();
|
||||||
final importState = Provider.of<ImportOmpl>(context).importState;
|
final importState = Provider.of<ImportOmpl>(context).importState;
|
||||||
if (importState == ImportState.complete) {
|
final subscribeUpdate = Provider.of<SettingState>(context).subscribeupdate;
|
||||||
setState(() {});
|
if (importState == ImportState.complete ||
|
||||||
|
subscribeUpdate == Setting.start) {
|
||||||
|
setState(() {
|
||||||
|
getPodcastLocal();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_loading = false;
|
||||||
|
getPodcastLocal();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
double _width = MediaQuery.of(context).size.width;
|
double _width = MediaQuery.of(context).size.width;
|
||||||
return FutureBuilder<List<PodcastLocal>>(
|
return !_loading
|
||||||
future: getPodcastLocal(),
|
? Container(
|
||||||
builder: (context, snapshot) {
|
height: (_width - 20) / 3 + 110,
|
||||||
if (snapshot.hasData) {
|
)
|
||||||
return DefaultTabController(
|
: DefaultTabController(
|
||||||
length: snapshot.data.length,
|
length: podcastList.length,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
@ -61,7 +82,7 @@ class _ScrollPodcastsState extends State<ScrollPodcasts> {
|
||||||
indicator:
|
indicator:
|
||||||
CircleTabIndicator(color: Colors.blue, radius: 3),
|
CircleTabIndicator(color: Colors.blue, radius: 3),
|
||||||
isScrollable: true,
|
isScrollable: true,
|
||||||
tabs: snapshot.data.map<Tab>((PodcastLocal podcastLocal) {
|
tabs: podcastList.map<Tab>((PodcastLocal podcastLocal) {
|
||||||
return Tab(
|
return Tab(
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(25.0)),
|
borderRadius: BorderRadius.all(Radius.circular(25.0)),
|
||||||
|
@ -77,14 +98,14 @@ class _ScrollPodcastsState extends State<ScrollPodcasts> {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
height: (_width-20)/3+40,
|
height: (_width - 20) / 3 + 40,
|
||||||
margin: EdgeInsets.only(left: 10, right: 10),
|
margin: EdgeInsets.only(left: 10, right: 10),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
child: TabBarView(
|
child: TabBarView(
|
||||||
children:
|
children:
|
||||||
snapshot.data.map<Widget>((PodcastLocal podcastLocal) {
|
podcastList.map<Widget>((PodcastLocal podcastLocal) {
|
||||||
return Container(
|
return Container(
|
||||||
decoration: BoxDecoration(color: Colors.grey[100]),
|
decoration: BoxDecoration(color: Colors.grey[100]),
|
||||||
margin: EdgeInsets.symmetric(horizontal: 5.0),
|
margin: EdgeInsets.symmetric(horizontal: 5.0),
|
||||||
|
@ -99,12 +120,6 @@ class _ScrollPodcastsState extends State<ScrollPodcasts> {
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
|
||||||
return Container(
|
|
||||||
height: 250.0,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,11 +282,11 @@ class ShowEpisode extends StatelessWidget {
|
||||||
tag: podcast[index].enclosureUrl + 'scroll',
|
tag: podcast[index].enclosureUrl + 'scroll',
|
||||||
child: Container(
|
child: Container(
|
||||||
child: ClipRRect(
|
child: ClipRRect(
|
||||||
borderRadius:
|
borderRadius: BorderRadius.all(
|
||||||
BorderRadius.all(Radius.circular(_width/36)),
|
Radius.circular(_width / 36)),
|
||||||
child: Container(
|
child: Container(
|
||||||
height: _width/18,
|
height: _width / 18,
|
||||||
width: _width/18,
|
width: _width / 18,
|
||||||
child: Image.file(File(
|
child: Image.file(File(
|
||||||
"$path/${podcastLocal.title}.png")),
|
"$path/${podcastLocal.title}.png")),
|
||||||
),
|
),
|
||||||
|
@ -290,7 +305,7 @@ class ShowEpisode extends StatelessWidget {
|
||||||
child: Text(
|
child: Text(
|
||||||
podcast[index].title,
|
podcast[index].title,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: _width/32,
|
fontSize: _width / 32,
|
||||||
),
|
),
|
||||||
maxLines: 4,
|
maxLines: 4,
|
||||||
overflow: TextOverflow.fade,
|
overflow: TextOverflow.fade,
|
||||||
|
@ -304,7 +319,7 @@ class ShowEpisode extends StatelessWidget {
|
||||||
child: Text(
|
child: Text(
|
||||||
podcast[index].pubDate.substring(4, 16),
|
podcast[index].pubDate.substring(4, 16),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: _width/35,
|
fontSize: _width / 35,
|
||||||
color: _c,
|
color: _c,
|
||||||
fontStyle: FontStyle.italic,
|
fontStyle: FontStyle.italic,
|
||||||
),
|
),
|
||||||
|
|
|
@ -6,6 +6,7 @@ import 'package:flutter_downloader/flutter_downloader.dart';
|
||||||
import 'package:tsacdop/home/appbar/addpodcast.dart';
|
import 'package:tsacdop/home/appbar/addpodcast.dart';
|
||||||
import 'package:tsacdop/class/audiostate.dart';
|
import 'package:tsacdop/class/audiostate.dart';
|
||||||
import 'package:tsacdop/class/importompl.dart';
|
import 'package:tsacdop/class/importompl.dart';
|
||||||
|
import 'package:tsacdop/class/settingstate.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
runApp(
|
runApp(
|
||||||
|
@ -13,6 +14,7 @@ void main() async {
|
||||||
providers: [
|
providers: [
|
||||||
ChangeNotifierProvider(create: (context) => Urlchange()),
|
ChangeNotifierProvider(create: (context) => Urlchange()),
|
||||||
ChangeNotifierProvider(create: (context) => ImportOmpl()),
|
ChangeNotifierProvider(create: (context) => ImportOmpl()),
|
||||||
|
ChangeNotifierProvider(create: (context) => SettingState()),
|
||||||
],
|
],
|
||||||
child: MyApp(),
|
child: MyApp(),
|
||||||
),
|
),
|
||||||
|
@ -21,7 +23,17 @@ void main() async {
|
||||||
await FlutterDownloader.initialize();
|
await FlutterDownloader.initialize();
|
||||||
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
|
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
|
||||||
await FlutterStatusbarcolor.setStatusBarColor(Colors.grey[100]);
|
await FlutterStatusbarcolor.setStatusBarColor(Colors.grey[100]);
|
||||||
|
if (useWhiteForeground(Colors.grey[100])) {
|
||||||
|
FlutterStatusbarcolor.setStatusBarWhiteForeground(true);
|
||||||
|
} else {
|
||||||
|
FlutterStatusbarcolor.setStatusBarWhiteForeground(false);
|
||||||
|
}
|
||||||
await FlutterStatusbarcolor.setNavigationBarColor(Colors.grey[100]);
|
await FlutterStatusbarcolor.setNavigationBarColor(Colors.grey[100]);
|
||||||
|
if (useWhiteForeground(Colors.grey[100])) {
|
||||||
|
FlutterStatusbarcolor.setNavigationBarWhiteForeground(true);
|
||||||
|
} else {
|
||||||
|
FlutterStatusbarcolor.setNavigationBarWhiteForeground(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
class MyApp extends StatelessWidget {
|
||||||
|
|
|
@ -91,7 +91,7 @@ class _PodcastListState extends State<PodcastList> {
|
||||||
Future<List<PodcastLocal>> getPodcastLocal() async {
|
Future<List<PodcastLocal>> getPodcastLocal() async {
|
||||||
dir = await getApplicationDocumentsDirectory();
|
dir = await getApplicationDocumentsDirectory();
|
||||||
var dbHelper = DBHelper();
|
var dbHelper = DBHelper();
|
||||||
Future<List<PodcastLocal>> podcastList = dbHelper.getPodcastLocal();
|
var podcastList = await dbHelper.getPodcastLocal();
|
||||||
return podcastList;
|
return podcastList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,167 @@
|
||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:fluttertoast/fluttertoast.dart';
|
||||||
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:tsacdop/class/podcastlocal.dart';
|
||||||
|
import 'package:tsacdop/class/sqflite_localpodcast.dart';
|
||||||
|
import 'package:tsacdop/class/settingstate.dart';
|
||||||
|
|
||||||
|
class PodcastManage extends StatefulWidget {
|
||||||
|
@override
|
||||||
|
_PodcastManageState createState() => _PodcastManageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PodcastManageState extends State<PodcastManage> {
|
||||||
|
var dir;
|
||||||
|
bool _loading;
|
||||||
|
bool _loadSave;
|
||||||
|
Color _c;
|
||||||
|
double _width;
|
||||||
|
List<PodcastLocal> podcastList;
|
||||||
|
getPodcastLocal() async {
|
||||||
|
dir = await getApplicationDocumentsDirectory();
|
||||||
|
var dbHelper = DBHelper();
|
||||||
|
podcastList = await dbHelper.getPodcastLocal();
|
||||||
|
setState(() {
|
||||||
|
_loading = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_unSubscribe(String title) async {
|
||||||
|
var dbHelper = DBHelper();
|
||||||
|
await dbHelper.delPodcastLocal(title);
|
||||||
|
print('Unsubscribe');
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_loading = false;
|
||||||
|
_loadSave = false;
|
||||||
|
getPodcastLocal();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _onReorder(int oldIndex, int newIndex) {
|
||||||
|
setState(() {
|
||||||
|
if (newIndex > oldIndex) {
|
||||||
|
newIndex -= 1;
|
||||||
|
}
|
||||||
|
final PodcastLocal podcast = podcastList.removeAt(oldIndex);
|
||||||
|
podcastList.insert(newIndex, podcast);
|
||||||
|
_loadSave = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_saveOrder(List<PodcastLocal> podcastList) async {
|
||||||
|
var dbHelper = DBHelper();
|
||||||
|
await dbHelper.saveOrder(podcastList);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _podcastCard(BuildContext context, PodcastLocal podcastLocal) {
|
||||||
|
var _settingState = Provider.of<SettingState>(context);
|
||||||
|
return Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 12),
|
||||||
|
height: 100,
|
||||||
|
child: Row(children: <Widget>[
|
||||||
|
Container(
|
||||||
|
child: Icon(
|
||||||
|
Icons.unfold_more,
|
||||||
|
color: _c,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
child: ClipRRect(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(30)),
|
||||||
|
child: Container(
|
||||||
|
height: 60,
|
||||||
|
width: 60,
|
||||||
|
child: Image.file(File("${dir.path}/${podcastLocal.title}.png")),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
width: _width / 2,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||||
|
child: Text(
|
||||||
|
podcastLocal.title,
|
||||||
|
maxLines: 2,
|
||||||
|
overflow: TextOverflow.fade,
|
||||||
|
)),
|
||||||
|
Spacer(),
|
||||||
|
OutlineButton(
|
||||||
|
child: Text('Unsubscribe'),
|
||||||
|
onPressed: () {
|
||||||
|
_unSubscribe(podcastLocal.title);
|
||||||
|
_settingState.subscribeUpdate = Setting.start;
|
||||||
|
setState(() {
|
||||||
|
getPodcastLocal();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
_width = MediaQuery.of(context).size.width;
|
||||||
|
var _settingState = Provider.of<SettingState>(context);
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('Podcasts'),
|
||||||
|
backgroundColor: Colors.grey[100],
|
||||||
|
elevation: 0,
|
||||||
|
centerTitle: true,
|
||||||
|
actions: <Widget>[
|
||||||
|
!_loadSave
|
||||||
|
? Center()
|
||||||
|
: InkWell(
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.all(20.0),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Text('Save')),
|
||||||
|
onTap: () async{
|
||||||
|
await _saveOrder(podcastList);
|
||||||
|
Fluttertoast.showToast(
|
||||||
|
msg: 'Saved',
|
||||||
|
gravity: ToastGravity.BOTTOM,
|
||||||
|
);
|
||||||
|
_settingState.subscribeUpdate = Setting.start;
|
||||||
|
setState(() {
|
||||||
|
_loadSave = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
IconButton(
|
||||||
|
icon: Icon(Icons.menu),
|
||||||
|
onPressed: () {},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
body: Container(
|
||||||
|
color: Colors.grey[100],
|
||||||
|
child: !_loading
|
||||||
|
? CircularProgressIndicator()
|
||||||
|
: ReorderableListView(
|
||||||
|
onReorder: _onReorder,
|
||||||
|
children: podcastList.map<Widget>((PodcastLocal podcastLocal) {
|
||||||
|
var color = json.decode(podcastLocal.primaryColor);
|
||||||
|
(color[0] > 200 && color[1] > 200 && color[2] > 200)
|
||||||
|
? _c = Color.fromRGBO(
|
||||||
|
(255 - color[0]), 255 - color[1], 255 - color[2], 1.0)
|
||||||
|
: _c = Color.fromRGBO(color[0], color[1], color[2], 1.0);
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(color: Colors.grey[100]),
|
||||||
|
margin: EdgeInsets.symmetric(horizontal: 5.0),
|
||||||
|
key: ObjectKey(podcastLocal.title),
|
||||||
|
child: _podcastCard(context, podcastLocal),
|
||||||
|
);
|
||||||
|
}).toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,7 +27,6 @@ class EpisodeGrid extends StatelessWidget {
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
double _width;
|
double _width;
|
||||||
Future<String> _getPath() async {
|
Future<String> _getPath() async {
|
||||||
print(_width);
|
|
||||||
var dir = await getApplicationDocumentsDirectory();
|
var dir = await getApplicationDocumentsDirectory();
|
||||||
return dir.path;
|
return dir.path;
|
||||||
}
|
}
|
||||||
|
|
14
pubspec.lock
14
pubspec.lock
|
@ -1,13 +1,6 @@
|
||||||
# Generated by pub
|
# Generated by pub
|
||||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||||
packages:
|
packages:
|
||||||
after_layout:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: after_layout
|
|
||||||
url: "https://pub.flutter-io.cn"
|
|
||||||
source: hosted
|
|
||||||
version: "1.0.7+2"
|
|
||||||
archive:
|
archive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -324,13 +317,6 @@ packages:
|
||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.5"
|
version: "2.0.5"
|
||||||
rubber:
|
|
||||||
dependency: "direct dev"
|
|
||||||
description:
|
|
||||||
name: rubber
|
|
||||||
url: "https://pub.flutter-io.cn"
|
|
||||||
source: hosted
|
|
||||||
version: "0.4.0"
|
|
||||||
sky_engine:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
|
@ -49,7 +49,6 @@ dev_dependencies:
|
||||||
intl: ^0.16.1
|
intl: ^0.16.1
|
||||||
url_launcher: ^5.4.1
|
url_launcher: ^5.4.1
|
||||||
image: ^2.1.4
|
image: ^2.1.4
|
||||||
rubber: ^0.4.0
|
|
||||||
|
|
||||||
|
|
||||||
# For information on the generic Dart part of this file, see the
|
# For information on the generic Dart part of this file, see the
|
||||||
|
|
Loading…
Reference in New Issue