mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-15 06:06:44 +02:00
Compare commits
6 Commits
v0.5.0-bet
...
v0.5.3-bet
Author | SHA1 | Date | |
---|---|---|---|
61f7f171b1 | |||
de07583161 | |||
49b9a65053 | |||
aebc8aed76 | |||
3958425c22 | |||
0a560871cb |
@ -1,9 +1,11 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:obtainium/components/generated_form.dart';
|
import 'package:obtainium/components/generated_form.dart';
|
||||||
import 'package:obtainium/custom_errors.dart';
|
import 'package:obtainium/custom_errors.dart';
|
||||||
import 'package:obtainium/providers/settings_provider.dart';
|
import 'package:obtainium/providers/settings_provider.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
|
||||||
class GitHub implements AppSource {
|
class GitHub implements AppSource {
|
||||||
@override
|
@override
|
||||||
@ -137,7 +139,7 @@ class GitHub implements AppSource {
|
|||||||
@override
|
@override
|
||||||
List<GeneratedFormItem> moreSourceSettingsFormItems = [
|
List<GeneratedFormItem> moreSourceSettingsFormItems = [
|
||||||
GeneratedFormItem(
|
GeneratedFormItem(
|
||||||
label: 'GitHub Credentials (Increases Rate Limit)',
|
label: 'GitHub Personal Access Token (Increases Rate Limit)',
|
||||||
id: 'github-creds',
|
id: 'github-creds',
|
||||||
required: false,
|
required: false,
|
||||||
additionalValidators: [
|
additionalValidators: [
|
||||||
@ -153,6 +155,23 @@ class GitHub implements AppSource {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
hint: 'username:token',
|
||||||
|
belowWidgets: [
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
launchUrlString(
|
||||||
|
'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token',
|
||||||
|
mode: LaunchMode.externalApplication);
|
||||||
|
},
|
||||||
|
child: const Text(
|
||||||
|
'About GitHub PATs',
|
||||||
|
style: TextStyle(
|
||||||
|
decoration: TextDecoration.underline, fontSize: 12),
|
||||||
|
))
|
||||||
])
|
])
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,8 @@ class GeneratedFormItem {
|
|||||||
late int max;
|
late int max;
|
||||||
late List<String? Function(String? value)> additionalValidators;
|
late List<String? Function(String? value)> additionalValidators;
|
||||||
late String id;
|
late String id;
|
||||||
|
late List<Widget> belowWidgets;
|
||||||
|
late String? hint;
|
||||||
|
|
||||||
GeneratedFormItem(
|
GeneratedFormItem(
|
||||||
{this.label = 'Input',
|
{this.label = 'Input',
|
||||||
@ -18,7 +20,9 @@ class GeneratedFormItem {
|
|||||||
this.required = true,
|
this.required = true,
|
||||||
this.max = 1,
|
this.max = 1,
|
||||||
this.additionalValidators = const [],
|
this.additionalValidators = const [],
|
||||||
this.id = 'input'});
|
this.id = 'input',
|
||||||
|
this.belowWidgets = const [],
|
||||||
|
this.hint});
|
||||||
}
|
}
|
||||||
|
|
||||||
class GeneratedForm extends StatefulWidget {
|
class GeneratedForm extends StatefulWidget {
|
||||||
@ -91,7 +95,8 @@ class _GeneratedFormState extends State<GeneratedForm> {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
helperText: e.value.label + (e.value.required ? ' *' : '')),
|
helperText: e.value.label + (e.value.required ? ' *' : ''),
|
||||||
|
hintText: e.value.hint),
|
||||||
minLines: e.value.max <= 1 ? null : e.value.max,
|
minLines: e.value.max <= 1 ? null : e.value.max,
|
||||||
maxLines: e.value.max <= 1 ? 1 : e.value.max,
|
maxLines: e.value.max <= 1 ? 1 : e.value.max,
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
@ -157,7 +162,13 @@ class _GeneratedFormState extends State<GeneratedForm> {
|
|||||||
width: 20,
|
width: 20,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
rowItems.add(Expanded(child: rowInput.value));
|
rowItems.add(Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
||||||
|
children: [
|
||||||
|
rowInput.value,
|
||||||
|
...widget.items[rowInputs.key][rowInput.key].belowWidgets
|
||||||
|
])));
|
||||||
});
|
});
|
||||||
rows.add(rowItems);
|
rows.add(rowItems);
|
||||||
});
|
});
|
||||||
|
@ -14,7 +14,7 @@ import 'package:dynamic_color/dynamic_color.dart';
|
|||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
|
|
||||||
const String currentReleaseTag =
|
const String currentReleaseTag =
|
||||||
'v0.5.0-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
|
'v0.5.3-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES
|
||||||
|
|
||||||
const String bgUpdateCheckTaskName = 'bg-update-check';
|
const String bgUpdateCheckTaskName = 'bg-update-check';
|
||||||
|
|
||||||
@ -37,7 +37,6 @@ bgUpdateCheck(int? ignoreAfterMicroseconds) async {
|
|||||||
await appsProvider.checkUpdates(ignoreAfter: ignoreAfter);
|
await appsProvider.checkUpdates(ignoreAfter: ignoreAfter);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e is RateLimitError) {
|
if (e is RateLimitError) {
|
||||||
// Ignore these (scheduling another task as below does not work)
|
|
||||||
String nextTaskName =
|
String nextTaskName =
|
||||||
'$bgUpdateCheckTaskName-${nextIgnoreAfter.microsecondsSinceEpoch.toString()}';
|
'$bgUpdateCheckTaskName-${nextIgnoreAfter.microsecondsSinceEpoch.toString()}';
|
||||||
Workmanager().registerOneOffTask(nextTaskName, nextTaskName,
|
Workmanager().registerOneOffTask(nextTaskName, nextTaskName,
|
||||||
@ -108,14 +107,21 @@ void main() async {
|
|||||||
ChangeNotifierProvider(create: (context) => SettingsProvider()),
|
ChangeNotifierProvider(create: (context) => SettingsProvider()),
|
||||||
Provider(create: (context) => NotificationsProvider())
|
Provider(create: (context) => NotificationsProvider())
|
||||||
],
|
],
|
||||||
child: const MyApp(),
|
child: const Obtainium(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultThemeColour = Colors.deepPurple;
|
var defaultThemeColour = Colors.deepPurple;
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
class Obtainium extends StatefulWidget {
|
||||||
const MyApp({super.key});
|
const Obtainium({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<Obtainium> createState() => _ObtainiumState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ObtainiumState extends State<Obtainium> {
|
||||||
|
var existingUpdateInterval = -1;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -144,18 +150,21 @@ class MyApp extends StatelessWidget {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
// Register the background update task according to the user's setting
|
// Register the background update task according to the user's setting
|
||||||
if (settingsProvider.updateInterval == 0) {
|
if (existingUpdateInterval != settingsProvider.updateInterval) {
|
||||||
Workmanager().cancelByUniqueName(bgUpdateCheckTaskName);
|
existingUpdateInterval = settingsProvider.updateInterval;
|
||||||
} else {
|
if (existingUpdateInterval == 0) {
|
||||||
Workmanager().registerPeriodicTask(
|
Workmanager().cancelByUniqueName(bgUpdateCheckTaskName);
|
||||||
bgUpdateCheckTaskName, bgUpdateCheckTaskName,
|
} else {
|
||||||
frequency: Duration(minutes: settingsProvider.updateInterval),
|
Workmanager().registerPeriodicTask(
|
||||||
initialDelay: Duration(minutes: settingsProvider.updateInterval),
|
bgUpdateCheckTaskName, bgUpdateCheckTaskName,
|
||||||
constraints: Constraints(networkType: NetworkType.connected),
|
frequency: Duration(minutes: existingUpdateInterval),
|
||||||
existingWorkPolicy: ExistingWorkPolicy.keep,
|
initialDelay: Duration(minutes: existingUpdateInterval),
|
||||||
backoffPolicy: BackoffPolicy.linear,
|
constraints: Constraints(networkType: NetworkType.connected),
|
||||||
backoffPolicyDelay:
|
existingWorkPolicy: ExistingWorkPolicy.replace,
|
||||||
const Duration(minutes: minUpdateIntervalMinutes));
|
backoffPolicy: BackoffPolicy.linear,
|
||||||
|
backoffPolicyDelay:
|
||||||
|
const Duration(minutes: minUpdateIntervalMinutes));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,6 +293,11 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
await saveApps([newApp]);
|
await saveApps([newApp]);
|
||||||
return newApp;
|
return newApp;
|
||||||
|
} else if ((newApp.lastUpdateCheck?.microsecondsSinceEpoch ?? 0) -
|
||||||
|
(currentApp.lastUpdateCheck?.microsecondsSinceEpoch ?? 0) >
|
||||||
|
5000000) {
|
||||||
|
currentApp.lastUpdateCheck = newApp.lastUpdateCheck;
|
||||||
|
await saveApps([currentApp]);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -306,7 +311,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (ignoreAfter != null) {
|
if (ignoreAfter != null) {
|
||||||
appIds = appIds
|
appIds = appIds
|
||||||
.where((id) =>
|
.where((id) =>
|
||||||
apps[id]!.app.lastUpdateCheck != null &&
|
apps[id]!.app.lastUpdateCheck == null ||
|
||||||
apps[id]!.app.lastUpdateCheck!.isBefore(ignoreAfter))
|
apps[id]!.app.lastUpdateCheck!.isBefore(ignoreAfter))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
|
@ -129,5 +129,6 @@ class SettingsProvider with ChangeNotifier {
|
|||||||
|
|
||||||
void setSettingString(String settingId, String value) {
|
void setSettingString(String settingId, String value) {
|
||||||
prefs?.setString(settingId, value);
|
prefs?.setString(settingId, value);
|
||||||
|
notifyListeners();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -407,7 +407,7 @@ packages:
|
|||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "10.0.0"
|
version: "10.1.0"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -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.5.0+21 # When changing this, update the tag in main() accordingly
|
version: 0.5.3+24 # 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'
|
||||||
|
@ -13,7 +13,7 @@ import 'package:obtainium/main.dart';
|
|||||||
void main() {
|
void main() {
|
||||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||||
// Build our app and trigger a frame.
|
// Build our app and trigger a frame.
|
||||||
await tester.pumpWidget(const MyApp());
|
await tester.pumpWidget(const Obtainium());
|
||||||
|
|
||||||
// Verify that our counter starts at 0.
|
// Verify that our counter starts at 0.
|
||||||
expect(find.text('0'), findsOneWidget);
|
expect(find.text('0'), findsOneWidget);
|
||||||
|
Reference in New Issue
Block a user