Skip to content

Commit

Permalink
feat: ✨ settings screen
Browse files Browse the repository at this point in the history
fixes Settings screen #39
fixes add all contributors to credits page #25
  • Loading branch information
lucafluri committed Jul 15, 2020
1 parent cc88bad commit dc6ec56
Show file tree
Hide file tree
Showing 11 changed files with 247 additions and 150 deletions.
4 changes: 2 additions & 2 deletions lib/routes.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import 'package:flutter/widgets.dart';
import 'package:price_tracker/screens/credits/credits.dart';
import 'package:price_tracker/screens/home/home.dart';
import 'package:price_tracker/screens/intro/intro.dart';
import 'package:price_tracker/screens/settings/settings.dart';

final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
"/": (BuildContext context) => HomeScreen(),
"/intro": (context) => IntroScreen(),
"/credits": (context) => CreditsScreen(),
"/settings": (context) => SettingsScreen(),
};
57 changes: 0 additions & 57 deletions lib/screens/credits/credits.dart

This file was deleted.

2 changes: 2 additions & 0 deletions lib/screens/home/components/product_list_tile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:price_tracker/models/product.dart';
import 'package:price_tracker/services/product_utils.dart';
import 'package:price_tracker/screens/product_detail/product_detail.dart';
import 'package:share/share.dart';
import 'package:url_launcher/url_launcher.dart';
Expand Down Expand Up @@ -133,6 +134,7 @@ class ProductListTile extends StatelessWidget {
child: Container(
color: _underTarget ? Colors.green[800] : Colors.transparent,
child: ListTile(
enabled: refreshing,
title: Text(
product.getShortName(),
overflow: TextOverflow.ellipsis,
Expand Down
71 changes: 13 additions & 58 deletions lib/screens/home/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,9 @@ import 'package:flutter/material.dart';
import 'package:price_tracker/components/widget_view/widget_view.dart';
import 'package:price_tracker/screens/home/components/product_list_tile.dart';
import 'package:price_tracker/screens/home/home_controller.dart';
import 'package:price_tracker/services/backup.dart';
import 'package:price_tracker/screens/settings/settings_controller.dart';
import 'package:price_tracker/services/product_utils.dart';
import 'package:toast/toast.dart';
import 'package:workmanager/workmanager.dart';

/// Set this to 'true' if you want to have a red button to create a test-notification:
const NOTIFICATION_TEST_BUTTON = false;
const BACKGROUND_TEST_BUTTON = false;

class HomeScreen extends StatefulWidget {
HomeScreen({Key key}) : super(key: key);
Expand All @@ -28,27 +23,14 @@ class HomeScreenView extends WidgetView<HomeScreen, HomeScreenController> {
brightness: Brightness.dark,
backgroundColor: Colors.transparent,
iconTheme: IconThemeData(color: Theme.of(context).primaryColor),
title: Text('Price Tracker BETA',
title: Text(Settings.APP_NAME,
style: TextStyle(color: Theme.of(context).primaryColor)),
actions: <Widget>[
if (NOTIFICATION_TEST_BUTTON)
IconButton(
icon: Icon(Icons.speaker_notes),
onPressed: () => state.testNotification(),
color: Colors.redAccent,
),
if (BACKGROUND_TEST_BUTTON)
IconButton(
icon: Icon(Icons.cloud_download),
onPressed: () => Workmanager.registerOneOffTask(
"manualPriceScraping", "Manual Price Tracker Scraper"),
color: Colors.redAccent,
),
// Show Reload Button if internet connection avialable or internet error icon if not
state.iConnectivity
? IconButton(
icon: Icon(Icons.refresh),
onPressed: () => state.onRefresh(),
onPressed: refreshing ? null : () => state.onRefresh(),
)
: IconButton(
icon: Icon(
Expand All @@ -57,13 +39,12 @@ class HomeScreenView extends WidgetView<HomeScreen, HomeScreenController> {
),
onPressed: () => state.checkInternet(),
),

IconButton(
icon: Icon(Icons.help_outline),
onPressed: () => Navigator.of(context).pushNamed("/intro"),
),
IconButton(
icon: Icon(Icons.description),
onPressed: () => Navigator.of(context).pushNamed("/credits"),
icon: Icon(Icons.settings),
onPressed: refreshing
? null
: () => Navigator.of(context).pushNamed("/settings"),
),
],
);
Expand All @@ -78,7 +59,7 @@ class HomeScreenView extends WidgetView<HomeScreen, HomeScreenController> {
duration: 3, gravity: Toast.BOTTOM);
},
tooltip: state.iConnectivity ? 'Add Product' : 'No Internet',
backgroundColor: state.iConnectivity ? null : Colors.grey,
backgroundColor: state.iConnectivity && !refreshing ? null : Colors.grey,
child: Icon(Icons.add),
);
}
Expand All @@ -100,36 +81,7 @@ class HomeScreenView extends WidgetView<HomeScreen, HomeScreenController> {
controller: state.listviewController,
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
MaterialButton(
color: Colors.green,
child: Text("Backup"),
onPressed: () async {
BackupService.instance.backup();
}),
Container(
width: 20,
),
MaterialButton(
color: Colors.blue,
child: Text("Restore"),
onPressed: () async {
BackupService.instance.restore();
}),
Container(
width: 20,
),
MaterialButton(
color: Colors.redAccent,
child: Text("DELETE DB"),
onPressed: () async {
BackupService.instance.clearDB();
}),
],
),
if (state.refreshing)
if (refreshing)
Padding(
padding: const EdgeInsets.symmetric(vertical: 12.0),
child: Center(
Expand All @@ -144,6 +96,9 @@ class HomeScreenView extends WidgetView<HomeScreen, HomeScreenController> {
backgroundColor: Colors.grey[800],
value: reloadProgress,
),
MaterialButton(
child: Text("Cancel"),
onPressed: () => cancelReload = true)
],
)),
),
Expand Down
19 changes: 0 additions & 19 deletions lib/screens/home/home_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ class HomeScreenController extends State<HomeScreen> {
ScrollController listviewController;

bool loading = false;
bool refreshing = false;
String refreshingText = "Refreshing Prices";
List<Product> products = <Product>[];
bool iConnectivity = true;
Expand Down Expand Up @@ -203,24 +202,6 @@ class HomeScreenController extends State<HomeScreen> {
curve: Curves.easeInOut, duration: Duration(milliseconds: 1000));
}

testNotification() {
Product p = Product.fromMap({
"_id": 5,
"name": "Apple iPad (10.2-inch, WiFi, 32GB) - Gold (latest model)",
"productUrl": "testUrl.com",
"prices": "[-1.0, 269.0, 260.0]",
"dates":
"[2020-07-02 00:00:00.000, 2020-07-03 15:43:12.345, 2020-07-04 04:00:45.000]",
"targetPrice": "261.0",
"imageUrl": "",
"parseSuccess": "true",
});
// Only one can be send at a time (same id)
sendPriceFallNotification(p);
// sendUnderTargetNotification(p);
// sendAvailableAgainNotification(p);
}

@override
Widget build(BuildContext context) => HomeScreenView(this);
}
154 changes: 154 additions & 0 deletions lib/screens/settings/settings.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:price_tracker/components/widget_view/widget_view.dart';
import 'package:price_tracker/screens/settings/settings_controller.dart';
import 'package:price_tracker/services/backup.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:settings_ui/settings_ui.dart';

class SettingsScreen extends StatefulWidget {
SettingsScreen({Key key}) : super(key: key);

@override
Settings createState() => Settings();
}

class SettingsScreenView extends WidgetView<SettingsScreen, Settings> {
SettingsScreenView(Settings state) : super(state);

launchUrl(String url) async {
if (await canLaunch(url))
await launch(url);
else
throw "Could not launch URL";
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 0,
brightness: Brightness.dark,
backgroundColor: Colors.transparent,
iconTheme: IconThemeData(color: Theme.of(context).primaryColor),
title: Text("Settings",
style: TextStyle(color: Theme.of(context).primaryColor)),
leading: BackButton(
onPressed: () {
Navigator.of(context)
.pushNamedAndRemoveUntil("/", (route) => false);
},
),
),
body: SettingsList(
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
sections: [
SettingsSection(
title: 'Backup / Restore',
tiles: [
SettingsTile(
title: 'Backup',
subtitle: 'Save Backup File',
leading: Icon(Icons.backup),
onTap: () async {
await BackupService.instance.backup();
state.showToast("Backup file saved");
},
),
SettingsTile(
title: 'Restore',
subtitle:
'Restore from Backup File - loads all products into database',
leading: Icon(Icons.cloud_download),
onTap: () async {
await BackupService.instance.restore();
state.showToast("Products added to database");
},
),
],
),
SettingsSection(
title: 'Help',
tiles: [
SettingsTile(
title: 'Tutorial',
subtitle: 'Open Tutorial',
leading: Icon(Icons.live_help),
onTap: () {
Navigator.of(context).pushNamed("/intro");
},
),
],
),
SettingsSection(
title: 'DEVELOPER DANGER ZONE',
tiles: [
SettingsTile(
title: 'Clear DB',
leading: Icon(Icons.warning),
onTap: () => state.clearDB(),
),
SettingsTile(
title: 'Test Notification (Price Fall)',
leading: Icon(Icons.warning),
onTap: () => state.testPriceFallNotification(),
),
SettingsTile(
title: 'Test Notification (Under Target)',
leading: Icon(Icons.warning),
onTap: () => state.testUnderTargetNotification(),
),
SettingsTile(
title: 'Test Notification (Available Again)',
leading: Icon(Icons.warning),
onTap: () => state.testAvailableAgainNotification(),
),
SettingsTile(
title: 'Test Background Service',
leading: Icon(Icons.warning),
onTap: () => state.testBackgroundService(),
),
],
),
SettingsSection(
title: 'Credits',
tiles: [
SettingsTile(
title: 'Luca Fluri',
subtitle: '@lucafluri, lucafluri.ch',
leading: Icon(Icons.person),
onTap: () => launchUrl("https://www.lucafluri.ch"),
),
SettingsTile(
title: 'Andreas Ambühl',
subtitle: '@AndiSwiss, andiswiss.ch',
leading: Icon(Icons.person_outline),
onTap: () => launchUrl("https://andiswiss.ch/"),
),
SettingsTile(
title: 'Dario Breitenstein',
subtitle: '@chdabre, imakethings.ch',
leading: Icon(Icons.person_outline),
onTap: () => launchUrl("https://www.imakethings.ch/"),
),
SettingsTile(
title: 'Marc Schnydrig',
subtitle: '@marcschny',
leading: Icon(Icons.person_outline),
onTap: () => launchUrl("https://github.com/marcschny"),
),
],
),
SettingsSection(
title: 'Version',
tiles: [
SettingsTile(
title: Settings.VERSION,
),
],
),
],
),
);
}
}
Loading

0 comments on commit dc6ec56

Please sign in to comment.