mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-11-04 07:13:28 +01:00 
			
		
		
		
	Finished switch to new download/install process
This commit is contained in:
		@@ -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,
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
      ),
 | 
					          )),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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,
 | 
				
			||||||
        ));
 | 
					      ),
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user