JSON import link support (#368)

This commit is contained in:
Imran Remtulla
2023-12-16 00:31:32 -05:00
parent 415460df75
commit 7413f693d7
2 changed files with 43 additions and 21 deletions

View File

@ -28,16 +28,15 @@
<intent-filter> <intent-filter>
<action <action
android:name="com.android_package_installer.content.SESSION_API_PACKAGE_INSTALLED" android:name="com.android_package_installer.content.SESSION_API_PACKAGE_INSTALLED"
android:exported="false"/> android:exported="false" />
</intent-filter> </intent-filter>
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="obtainium" <data android:scheme="obtainium" />
android:host="add" />
</intent-filter> </intent-filter>
</activity> </activity>
<!-- Don't delete the meta-data below. <!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
@ -47,10 +46,10 @@
<service <service
android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmService" android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmService"
android:permission="android.permission.BIND_JOB_SERVICE" android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/> android:exported="false" />
<receiver <receiver
android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmBroadcastReceiver" android:name="dev.fluttercommunity.plus.androidalarmmanager.AlarmBroadcastReceiver"
android:exported="false"/> android:exported="false" />
<receiver <receiver
android:name="dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver" android:name="dev.fluttercommunity.plus.androidalarmmanager.RebootBroadcastReceiver"
android:enabled="false" android:enabled="false"
@ -60,24 +59,24 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="dev.imranr.obtainium" android:authorities="dev.imranr.obtainium"
android:grantUriPermissions="true"> android:grantUriPermissions="true">
<meta-data <meta-data
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/> android:resource="@xml/file_paths" />
</provider> </provider>
</application> </application>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" /> <uses-permission android:name="android.permission.UPDATE_PACKAGES_WITHOUT_USER_ACTION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK"/> <uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/> <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
<uses-permission <uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29"/> android:maxSdkVersion="29" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
</manifest> </manifest>

View File

@ -5,6 +5,7 @@ import 'package:app_links/app_links.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:obtainium/custom_errors.dart';
import 'package:obtainium/pages/add_app.dart'; import 'package:obtainium/pages/add_app.dart';
import 'package:obtainium/pages/apps.dart'; import 'package:obtainium/pages/apps.dart';
import 'package:obtainium/pages/import_export.dart'; import 'package:obtainium/pages/import_export.dart';
@ -55,7 +56,7 @@ class _HomePageState extends State<HomePage> {
Future<void> initDeepLinks() async { Future<void> initDeepLinks() async {
_appLinks = AppLinks(); _appLinks = AppLinks();
goToAddApp(Uri uri) async { goToAddApp(String data) async {
switchToPage(1); switchToPage(1);
while ( while (
(pages[1].widget.key as GlobalKey<AddAppPageState>?)?.currentState == (pages[1].widget.key as GlobalKey<AddAppPageState>?)?.currentState ==
@ -64,18 +65,40 @@ class _HomePageState extends State<HomePage> {
} }
(pages[1].widget.key as GlobalKey<AddAppPageState>?) (pages[1].widget.key as GlobalKey<AddAppPageState>?)
?.currentState ?.currentState
?.linkFn(uri.path.length > 1 ? uri.path.substring(1) : ""); ?.linkFn(data);
}
interpretLink(Uri uri) async {
var action = uri.host;
var data = uri.path.length > 1 ? uri.path.substring(1) : "";
try {
if (action == 'add') {
await goToAddApp(data);
} else if (action == 'app') {
await context
.read<AppsProvider>()
.importApps('[${Uri.decodeComponent(data)}]');
} else if (action == 'apps') {
await context
.read<AppsProvider>()
.importApps(Uri.decodeComponent(data));
} else {
throw ObtainiumError(tr('unknown'));
}
} catch (e) {
showError(e, context);
}
} }
// Check initial link if app was in cold state (terminated) // Check initial link if app was in cold state (terminated)
final appLink = await _appLinks.getInitialAppLink(); final appLink = await _appLinks.getInitialAppLink();
if (appLink != null) { if (appLink != null) {
await goToAddApp(appLink); await interpretLink(appLink);
} }
// Handle link when app is in warm state (front or background) // Handle link when app is in warm state (front or background)
_linkSubscription = _appLinks.uriLinkStream.listen((uri) async { _linkSubscription = _appLinks.uriLinkStream.listen((uri) async {
await goToAddApp(uri); await interpretLink(uri);
}); });
} }