Added update all button + Obtainium added by default

This commit is contained in:
Imran Remtulla
2022-08-25 14:26:15 -04:00
parent aeada9635d
commit 0362cdf8ac
4 changed files with 82 additions and 46 deletions

View File

@@ -22,7 +22,7 @@ void backgroundUpdateCheck() {
important: false); important: false);
try { try {
await appsProvider.loadApps(); await appsProvider.loadApps();
List<App> updates = await appsProvider.getUpdates(); List<App> updates = await appsProvider.checkUpdates();
if (updates.isNotEmpty) { if (updates.isNotEmpty) {
String message = updates.length == 1 String message = updates.length == 1
? '${updates[0].name} has an update.' ? '${updates[0].name} has an update.'
@@ -87,13 +87,14 @@ class MyApp extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DynamicColorBuilder( return DynamicColorBuilder(
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) { builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
AppsProvider appsProvider = context.read<AppsProvider>();
appsProvider.deleteSavedAPKs();
// Initialize the settings provider (if needed) and perform first-run actions if needed // Initialize the settings provider (if needed) and perform first-run actions if needed
SettingsProvider settingsProvider = context.watch<SettingsProvider>(); SettingsProvider settingsProvider = context.watch<SettingsProvider>();
if (settingsProvider.prefs == null) { if (settingsProvider.prefs == null) {
settingsProvider.initializeSettings().then((_) { settingsProvider.initializeSettings().then((_) {
bool isFirstRun = settingsProvider.checkAndFlipFirstRun(); bool isFirstRun = settingsProvider.checkAndFlipFirstRun();
if (isFirstRun) { if (isFirstRun) {
AppsProvider appsProvider = context.read<AppsProvider>();
appsProvider appsProvider
.notify( .notify(
3, 3,
@@ -106,6 +107,14 @@ class MyApp extends StatelessWidget {
.whenComplete(() { .whenComplete(() {
appsProvider.downloaderNotifications.cancel(3); appsProvider.downloaderNotifications.cancel(3);
}); });
appsProvider.saveApp(App(
'imranr98_obtainium_github',
'https://github.com/ImranR98/Obtainium',
'ImranR98',
'Obtainium',
'v0.1.0-beta', // KEEP THIS IN SYNC WITH GITHUB RELEASES
'v0.1.0-beta',
''));
} }
}); });
} }

View File

@@ -14,46 +14,62 @@ class _AppsPageState extends State<AppsPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var appsProvider = context.watch<AppsProvider>(); var appsProvider = context.watch<AppsProvider>();
appsProvider.getUpdates(); appsProvider.checkUpdates();
var existingUpdateAppIds = appsProvider.getExistingUpdates();
return Center( return Scaffold(
child: appsProvider.loadingApps floatingActionButton: existingUpdateAppIds.isEmpty
? const CircularProgressIndicator() ? null
: appsProvider.apps.isEmpty : ElevatedButton.icon(
? Text( onPressed: appsProvider.apps.values
'No Apps', .where((element) => element.downloadProgress != null)
style: Theme.of(context).textTheme.headline4, .isNotEmpty
) ? null
: RefreshIndicator( : () {
onRefresh: appsProvider.getUpdates, for (var e in existingUpdateAppIds) {
child: ListView( appsProvider.downloadAndInstallLatestApp(e);
children: appsProvider.apps.values }
.map( },
(e) => ListTile( icon: const Icon(Icons.update),
title: Text('${e.app.author}/${e.app.name}'), label: const Text('Update All')),
subtitle: body: Center(
Text(e.app.installedVersion ?? 'Not Installed'), child: appsProvider.loadingApps
trailing: e.downloadProgress != null ? const CircularProgressIndicator()
? Text( : appsProvider.apps.isEmpty
'Downloading - ${e.downloadProgress!.toInt()}%') ? Text(
: (e.app.installedVersion != null && 'No Apps',
e.app.installedVersion != style: Theme.of(context).textTheme.headline4,
e.app.latestVersion )
? const Text('Update Available') : RefreshIndicator(
: null), onRefresh: appsProvider.checkUpdates,
onTap: () { child: ListView(
Navigator.push( children: appsProvider.apps.values
context, .map(
MaterialPageRoute( (e) => ListTile(
builder: (context) => title: Text('${e.app.author}/${e.app.name}'),
AppPage(appId: e.app.id)), subtitle: Text(
); e.app.installedVersion ?? 'Not Installed'),
}, trailing: e.downloadProgress != null
), ? Text(
) 'Downloading - ${e.downloadProgress!.toInt()}%')
.toList(), : (e.app.installedVersion != null &&
), e.app.installedVersion !=
), e.app.latestVersion
); ? const Text('Update Available')
: null),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
AppPage(appId: e.app.id)),
);
},
),
)
.toList(),
),
),
));
} }
} }

View File

@@ -132,6 +132,15 @@ class AppsProvider with ChangeNotifier {
return appsDir; return appsDir;
} }
Future<void> deleteSavedAPKs() async {
(await getExternalStorageDirectory())
?.listSync()
.where((element) => element.path.endsWith('.apk'))
.forEach((element) {
element.deleteSync();
});
}
Future<void> loadApps() async { Future<void> loadApps() async {
loadingApps = true; loadingApps = true;
notifyListeners(); notifyListeners();
@@ -186,7 +195,7 @@ class AppsProvider with ChangeNotifier {
return null; return null;
} }
Future<List<App>> getUpdates() async { Future<List<App>> checkUpdates() async {
List<App> updates = []; List<App> updates = [];
if (!gettingUpdates) { if (!gettingUpdates) {
gettingUpdates = true; gettingUpdates = true;
@@ -203,14 +212,16 @@ class AppsProvider with ChangeNotifier {
return updates; return updates;
} }
Future<void> installUpdates() async { List<String> getExistingUpdates() {
List<String> updateAppIds = [];
List<String> appIds = apps.keys.toList(); List<String> appIds = apps.keys.toList();
for (int i = 0; i < appIds.length; i++) { for (int i = 0; i < appIds.length; i++) {
App? app = apps[appIds[i]]!.app; App? app = apps[appIds[i]]!.app;
if (app.installedVersion != app.latestVersion) { if (app.installedVersion != app.latestVersion) {
await downloadAndInstallLatestApp(app.id); updateAppIds.add(app.id);
} }
} }
return updateAppIds;
} }
@override @override

View File

@@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 0.1.0+1 version: 0.1.0+1 # When changing this, update the tag in main() accordingly
environment: environment:
sdk: '>=2.19.0-79.0.dev <3.0.0' sdk: '>=2.19.0-79.0.dev <3.0.0'