mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-29 20:20:14 +02:00
Added update all button + Obtainium added by default
This commit is contained in:
@@ -22,7 +22,7 @@ void backgroundUpdateCheck() {
|
||||
important: false);
|
||||
try {
|
||||
await appsProvider.loadApps();
|
||||
List<App> updates = await appsProvider.getUpdates();
|
||||
List<App> updates = await appsProvider.checkUpdates();
|
||||
if (updates.isNotEmpty) {
|
||||
String message = updates.length == 1
|
||||
? '${updates[0].name} has an update.'
|
||||
@@ -87,13 +87,14 @@ class MyApp extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
return DynamicColorBuilder(
|
||||
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
|
||||
SettingsProvider settingsProvider = context.watch<SettingsProvider>();
|
||||
if (settingsProvider.prefs == null) {
|
||||
settingsProvider.initializeSettings().then((_) {
|
||||
bool isFirstRun = settingsProvider.checkAndFlipFirstRun();
|
||||
if (isFirstRun) {
|
||||
AppsProvider appsProvider = context.read<AppsProvider>();
|
||||
appsProvider
|
||||
.notify(
|
||||
3,
|
||||
@@ -106,6 +107,14 @@ class MyApp extends StatelessWidget {
|
||||
.whenComplete(() {
|
||||
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',
|
||||
''));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -14,9 +14,25 @@ class _AppsPageState extends State<AppsPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var appsProvider = context.watch<AppsProvider>();
|
||||
appsProvider.getUpdates();
|
||||
appsProvider.checkUpdates();
|
||||
var existingUpdateAppIds = appsProvider.getExistingUpdates();
|
||||
|
||||
return Center(
|
||||
return Scaffold(
|
||||
floatingActionButton: existingUpdateAppIds.isEmpty
|
||||
? null
|
||||
: ElevatedButton.icon(
|
||||
onPressed: appsProvider.apps.values
|
||||
.where((element) => element.downloadProgress != null)
|
||||
.isNotEmpty
|
||||
? null
|
||||
: () {
|
||||
for (var e in existingUpdateAppIds) {
|
||||
appsProvider.downloadAndInstallLatestApp(e);
|
||||
}
|
||||
},
|
||||
icon: const Icon(Icons.update),
|
||||
label: const Text('Update All')),
|
||||
body: Center(
|
||||
child: appsProvider.loadingApps
|
||||
? const CircularProgressIndicator()
|
||||
: appsProvider.apps.isEmpty
|
||||
@@ -25,14 +41,14 @@ class _AppsPageState extends State<AppsPage> {
|
||||
style: Theme.of(context).textTheme.headline4,
|
||||
)
|
||||
: RefreshIndicator(
|
||||
onRefresh: appsProvider.getUpdates,
|
||||
onRefresh: appsProvider.checkUpdates,
|
||||
child: ListView(
|
||||
children: appsProvider.apps.values
|
||||
.map(
|
||||
(e) => ListTile(
|
||||
title: Text('${e.app.author}/${e.app.name}'),
|
||||
subtitle:
|
||||
Text(e.app.installedVersion ?? 'Not Installed'),
|
||||
subtitle: Text(
|
||||
e.app.installedVersion ?? 'Not Installed'),
|
||||
trailing: e.downloadProgress != null
|
||||
? Text(
|
||||
'Downloading - ${e.downloadProgress!.toInt()}%')
|
||||
@@ -54,6 +70,6 @@ class _AppsPageState extends State<AppsPage> {
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
);
|
||||
));
|
||||
}
|
||||
}
|
||||
|
@@ -132,6 +132,15 @@ class AppsProvider with ChangeNotifier {
|
||||
return appsDir;
|
||||
}
|
||||
|
||||
Future<void> deleteSavedAPKs() async {
|
||||
(await getExternalStorageDirectory())
|
||||
?.listSync()
|
||||
.where((element) => element.path.endsWith('.apk'))
|
||||
.forEach((element) {
|
||||
element.deleteSync();
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> loadApps() async {
|
||||
loadingApps = true;
|
||||
notifyListeners();
|
||||
@@ -186,7 +195,7 @@ class AppsProvider with ChangeNotifier {
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<List<App>> getUpdates() async {
|
||||
Future<List<App>> checkUpdates() async {
|
||||
List<App> updates = [];
|
||||
if (!gettingUpdates) {
|
||||
gettingUpdates = true;
|
||||
@@ -203,14 +212,16 @@ class AppsProvider with ChangeNotifier {
|
||||
return updates;
|
||||
}
|
||||
|
||||
Future<void> installUpdates() async {
|
||||
List<String> getExistingUpdates() {
|
||||
List<String> updateAppIds = [];
|
||||
List<String> appIds = apps.keys.toList();
|
||||
for (int i = 0; i < appIds.length; i++) {
|
||||
App? app = apps[appIds[i]]!.app;
|
||||
if (app.installedVersion != app.latestVersion) {
|
||||
await downloadAndInstallLatestApp(app.id);
|
||||
updateAppIds.add(app.id);
|
||||
}
|
||||
}
|
||||
return updateAppIds;
|
||||
}
|
||||
|
||||
@override
|
||||
|
@@ -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
|
||||
# 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.
|
||||
version: 0.1.0+1
|
||||
version: 0.1.0+1 # When changing this, update the tag in main() accordingly
|
||||
|
||||
environment:
|
||||
sdk: '>=2.19.0-79.0.dev <3.0.0'
|
||||
|
Reference in New Issue
Block a user