Finished switch to new download/install process

This commit is contained in:
Imran Remtulla
2022-08-23 15:09:56 -04:00
parent c265cd01d9
commit b55fcafd95
4 changed files with 102 additions and 91 deletions

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:obtainium/pages/home.dart'; import 'package:obtainium/pages/home.dart';
import 'package:obtainium/services/apps_provider.dart'; import 'package:obtainium/services/apps_provider.dart';
import 'package:obtainium/services/source_service.dart'; import 'package:obtainium/services/source_service.dart';
@@ -30,6 +31,10 @@ void backgroundUpdateCheck() {
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(systemNavigationBarColor: Colors.transparent),
);
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
Workmanager().initialize( Workmanager().initialize(
backgroundUpdateCheck, backgroundUpdateCheck,
); );

View File

@@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:obtainium/services/apps_provider.dart'; import 'package:obtainium/services/apps_provider.dart';
import 'package:obtainium/services/source_service.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -23,37 +22,41 @@ class _AppPageState extends State<AppPage> {
} }
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('${app!.app.author}/${app.app.name}'), title: Text('${app?.app.author}/${app?.app.name}'),
), ),
body: WebView( body: WebView(
initialUrl: app.app.url, initialUrl: app?.app.url,
), ),
bottomSheet: Column( bottomSheet: Padding(
padding: EdgeInsets.fromLTRB(
0, 0, 0, MediaQuery.of(context).padding.bottom),
child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Padding( Padding(
padding: padding: const EdgeInsets.fromLTRB(16, 8, 16, 0),
const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [ children: [
Expanded( Expanded(
child: ElevatedButton( child: ElevatedButton(
onPressed: (app.app.installedVersion == null || onPressed: (app?.app.installedVersion == null ||
appsProvider.checkAppObjectForUpdate( appsProvider
app.app)) && .checkAppObjectForUpdate(
app.downloadProgress == null app!.app)) &&
app?.downloadProgress == null
? () { ? () {
appsProvider.downloadAndInstallLatestApp( appsProvider
app.app.id); .downloadAndInstallLatestApp(
app!.app.id);
} }
: null, : null,
child: Text(app.app.installedVersion == null child: Text(app?.app.installedVersion == null
? 'Install' ? 'Install'
: 'Update'))), : 'Update'))),
const SizedBox(width: 16.0), const SizedBox(width: 16.0),
ElevatedButton( ElevatedButton(
onPressed: app.downloadProgress != null onPressed: app?.downloadProgress != null
? null ? null
: () { : () {
showDialog( showDialog(
@@ -62,16 +65,17 @@ class _AppPageState extends State<AppPage> {
return AlertDialog( return AlertDialog(
title: const Text('Remove App?'), title: const Text('Remove App?'),
content: Text( content: Text(
'This will remove \'${app.app.name}\' from Obtainium.${app.app.installedVersion != null ? '\n\nNote that while Obtainium will no longer track its updates, the App will remain installed.' : ''}'), 'This will remove \'${app?.app.name}\' from Obtainium.${app?.app.installedVersion != null ? '\n\nNote that while Obtainium will no longer track its updates, the App will remain installed.' : ''}'),
actions: [ actions: [
TextButton( TextButton(
onPressed: () { onPressed: () {
appsProvider appsProvider
.removeApp(app.app.id) .removeApp(app!.app.id)
.then((_) { .then((_) {
int count = 0; int count = 0;
Navigator.of(context).popUntil( Navigator.of(context)
(_) => count++ >= 2); .popUntil((_) =>
count++ >= 2);
}); });
}, },
child: const Text('Remove')), child: const Text('Remove')),
@@ -90,10 +94,10 @@ class _AppPageState extends State<AppPage> {
child: const Text('Remove'), child: const Text('Remove'),
), ),
])), ])),
if (app.downloadProgress != null) if (app?.downloadProgress != null)
LinearProgressIndicator(value: app.downloadProgress) LinearProgressIndicator(value: app!.downloadProgress! / 100)
], ],
), )),
); );
} }
} }

View File

@@ -25,8 +25,7 @@ class _HomePageState extends State<HomePage> {
body: pages.elementAt(selectedIndex), body: pages.elementAt(selectedIndex),
bottomNavigationBar: NavigationBar( bottomNavigationBar: NavigationBar(
destinations: const [ destinations: const [
NavigationDestination( NavigationDestination(icon: Icon(Icons.settings), label: 'Settings'),
icon: Icon(Icons.settings), label: 'Settings'),
NavigationDestination(icon: Icon(Icons.apps), label: 'Apps'), NavigationDestination(icon: Icon(Icons.apps), label: 'Apps'),
NavigationDestination(icon: Icon(Icons.add), label: 'Add App'), NavigationDestination(icon: Icon(Icons.add), label: 'Add App'),
], ],
@@ -36,6 +35,7 @@ class _HomePageState extends State<HomePage> {
}); });
}, },
selectedIndex: selectedIndex, selectedIndex: selectedIndex,
)); ),
);
} }
} }

View File

@@ -72,7 +72,10 @@ class AppsProvider with ChangeNotifier {
StreamedResponse response = StreamedResponse response =
await Client().send(Request('GET', Uri.parse(apps[appId]!.app.apkUrl))); await Client().send(Request('GET', Uri.parse(apps[appId]!.app.apkUrl)));
File downloadFile = File downloadFile =
File('${(await getTemporaryDirectory()).path}/$appId.apk'); File('${(await getExternalStorageDirectory())!.path}/apks/$appId.apk');
if (downloadFile.existsSync()) {
downloadFile.deleteSync();
}
var length = response.contentLength; var length = response.contentLength;
var received = 0; var received = 0;
var sink = downloadFile.openWrite(); var sink = downloadFile.openWrite();
@@ -94,14 +97,13 @@ class AppsProvider with ChangeNotifier {
throw response.reasonPhrase ?? 'Unknown Error'; throw response.reasonPhrase ?? 'Unknown Error';
} }
var res = await InstallPlugin.installApk( // Unfortunately this 'await' does not actually wait for the APK to finish installing
downloadFile.path, 'dev.imranr.obtainium'); // So we only know that the install prompt was shown, but the user could still cancel w/o us knowing
print(res); // This also does not use the 'session-based' installer API, so background/silent updates are impossible
await InstallPlugin.installApk(downloadFile.path, 'dev.imranr.obtainium');
apps[appId]!.app.installedVersion = apps[appId]!.app.latestVersion; apps[appId]!.app.installedVersion = apps[appId]!.app.latestVersion;
saveApp(apps[appId]!.app); saveApp(apps[appId]!.app);
downloadFile.deleteSync();
} }
Future<Directory> getAppsDir() async { Future<Directory> getAppsDir() async {