Skip to content
This repository has been archived by the owner on Aug 1, 2021. It is now read-only.

Commit

Permalink
feat: OTA Updates Added.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ayush1325 committed Apr 11, 2020
1 parent c360db9 commit 80b9d63
Show file tree
Hide file tree
Showing 11 changed files with 262 additions and 3 deletions.
13 changes: 13 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:name="io.flutter.app.FlutterApplication"
android:label="COVID19 Status"
Expand All @@ -27,5 +29,16 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />

<provider
android:name="sk.fourq.otaupdate.OtaUpdateFileProvider"
android:authorities="${applicationId}.ota_update_provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>

</application>
</manifest>
4 changes: 4 additions & 0 deletions android/app/src/main/res/xml/filepaths.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_download" path="Download"/>
</paths>
1 change: 1 addition & 0 deletions lib/components/nav_drawer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ class NavDrawer extends StatelessWidget {
['Graphs', "/graphs"],
['Helpful Links', "/help"],
['About', '/about'],
['Settings', '/settings']
];

@override
Expand Down
42 changes: 42 additions & 0 deletions lib/components/settings_list.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import 'package:coronavirusstatus/helpers/permissions.dart';
import 'package:coronavirusstatus/helpers/updater.dart';
import 'package:coronavirusstatus/providers/settings_data.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class SettingsList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<SettingsData>(
builder: (context, model, _) => ListView(
children: <Widget>[
UpdateItem(
version: model.version,
),
],
),
);
}
}

class UpdateItem extends StatelessWidget {
final String version;

const UpdateItem({
Key key,
this.version,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return ListTile(
title: Text('Check For Updates'),
subtitle: Text(this.version),
onTap: () {
Permissions.requestPermission();
Updater().start(context);
},
trailing: Icon(Icons.refresh),
);
}
}
13 changes: 13 additions & 0 deletions lib/helpers/permissions.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import 'package:permission_handler/permission_handler.dart';

class Permissions {
static void requestPermission() async {
if (!await Permission.storage.isPermanentlyDenied) {
await Permission.storage.request();
}
}

static Future<bool> storagePermission() async {
return Permission.storage.isGranted;
}
}
99 changes: 99 additions & 0 deletions lib/helpers/updater.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import 'dart:convert';

import 'package:coronavirusstatus/helpers/permissions.dart';
import 'package:http/http.dart' as http;
import 'package:ota_update/ota_update.dart';
import 'package:package_info/package_info.dart';
import 'package:device_info/device_info.dart';
import 'dart:io' show Platform;
import 'package:flutter/material.dart';

class Updater {
void start(BuildContext context) async {
if (await Permissions.storagePermission()) {
if (Platform.isAndroid) {
var dat = await _fetchData();
if (await _check(dat.version)) {
var platform = await _platform();
if (platform != "") {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('New Version Available'),
action: SnackBarAction(
label: 'Update',
onPressed: () {
_update(dat.apks[platform]);
},
),
));
}
} else {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('Alread On Newset Version'),
));
}
}
} else {
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('Could not get storage permissions'),
));
}
}

Future<bool> _check(String version) async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
return (packageInfo.version.compareTo(version) == -1);
}

Future<Data> _fetchData() async {
Map<String, String> ans = Map();
var res = await http.get(
"https://api.github.com/repos/Ayush1325/Coronavirus-Status/releases/latest");
Map<String, dynamic> body = jsonDecode(res.body);

String version = body["tag_name"];
version = version.substring(1);
List<dynamic> assets = body['assets'];
Map<String, String> apks = Map.fromEntries(assets.map((e) {
Map<String, dynamic> item = e;
return MapEntry(
item['name'].toString(), item['browser_download_url'].toString());
}));
return Data(version, apks);
}

Future<String> _platform() async {
Map<String, String> abis = {
'x86': 'app-x86_64-release.apk',
'arm64-v8a': 'app-arm64-v8a-release.apk',
'armeabi-v7a': 'app-armeabi-v7a-release.apk',
};
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
var temp = androidInfo.supportedAbis;
for (MapEntry e in abis.entries) {
if (temp.contains(e.key)) {
return e.value;
}
}
return "";
}

void _update(String url) {
try {
OtaUpdate().execute(url, destinationFilename: 'covid19.apk').listen(
(OtaEvent event) {
print('EVENT: ${event.status} : ${event.value}');
},
);
} catch (e) {
print('Failed to make OTA update. Details: $e');
}
}
}

class Data {
final String version;
final Map<String, String> apks;

Data(this.version, this.apks);
}
2 changes: 2 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:coronavirusstatus/pages/about.dart';
import 'package:coronavirusstatus/pages/graphs.dart';
import 'package:coronavirusstatus/pages/helpful_links.dart';
import 'package:coronavirusstatus/pages/settings.dart';
import 'package:coronavirusstatus/pages/states.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
Expand Down Expand Up @@ -53,6 +54,7 @@ class MyApp extends StatelessWidget {
'/graphs': (context) => Graphs(),
'/help': (context) => HelpfulLinks(),
'/about': (context) => About(),
'/settings': (context) => Settings(),
},
initialRoute: '/home',
);
Expand Down
21 changes: 21 additions & 0 deletions lib/pages/settings.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import 'package:coronavirusstatus/components/nav_drawer.dart';
import 'package:coronavirusstatus/components/settings_list.dart';
import 'package:coronavirusstatus/providers/settings_data.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class Settings extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Settings'),
),
drawer: NavDrawer(),
body: ChangeNotifierProvider(
create: (_) => SettingsData(),
child: SettingsList(),
),
);
}
}
25 changes: 25 additions & 0 deletions lib/providers/settings_data.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:package_info/package_info.dart';

class SettingsData extends ChangeNotifier {
String version;

SettingsData() {
_dummyData();
refresh();
}

void _dummyData() {
this.version = "";
}

void refresh() async {
this.version = await _appVersion();
notifyListeners();
}

Future<String> _appVersion() async {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
return packageInfo.version;
}
}
39 changes: 37 additions & 2 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.3"
device_info:
dependency: "direct main"
description:
name: device_info
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.2+1"
flutter:
dependency: "direct main"
description: flutter
Expand Down Expand Up @@ -156,6 +163,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.4"
ota_update:
dependency: "direct main"
description:
name: ota_update
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.1"
package_info:
dependency: "direct main"
description:
name: package_info
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0+16"
path:
dependency: transitive
description:
Expand All @@ -170,6 +191,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.9.0"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.0+hotfix.3"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
petitparser:
dependency: transitive
description:
Expand Down Expand Up @@ -302,5 +337,5 @@ packages:
source: hosted
version: "2.2.0"
sdks:
dart: ">=2.5.0 <3.0.0"
flutter: ">=1.12.8 <2.0.0"
dart: ">=2.7.0 <3.0.0"
flutter: ">=1.12.13+hotfix.5 <2.0.0"
6 changes: 5 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: coronavirusstatus
description: A new Flutter application.
version: 1.2.2+6
version: 1.2.3+7

environment:
sdk: ">=2.3.0 <3.0.0"
Expand All @@ -14,6 +14,10 @@ dependencies:
intl: ^0.16.1
charts_flutter: ^0.9.0
url_launcher: ^5.4.2
ota_update: ^2.2.1
package_info: '>=0.4.0 <2.0.0'
device_info: ^0.4.2+1
permission_handler: ^5.0.0

dev_dependencies:
flutter_test:
Expand Down

0 comments on commit 80b9d63

Please sign in to comment.