From 2ee3c30b0e9e428e1a06ae32d983da9cad290e6a Mon Sep 17 00:00:00 2001 From: Koen Date: Mon, 27 Nov 2023 12:10:19 +0100 Subject: [PATCH] Better URL handling support. Prompt user to set Grayjay as a default handler for certain URLs. --- app/src/main/AndroidManifest.xml | 44 ++++++++++ .../java/com/futo/platformplayer/Settings.kt | 10 ++- .../java/com/futo/platformplayer/UIDialogs.kt | 41 ++++++++- .../states/StateAnnouncement.kt | 21 ++++- .../futo/platformplayer/states/StateApp.kt | 1 + .../main/res/layout/dialog_url_handling.xml | 86 +++++++++++++++++++ app/src/main/res/values/strings.xml | 6 ++ app/src/unstable/AndroidManifest.xml | 34 -------- 8 files changed, 204 insertions(+), 39 deletions(-) create mode 100644 app/src/main/res/layout/dialog_url_handling.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a659758a..85755ccb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -133,6 +133,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unit)? = null) { + val builder = AlertDialog.Builder(context) + val view = LayoutInflater.from(context).inflate(R.layout.dialog_url_handling, null) + builder.setView(view) + + val dialog = builder.create() + registerDialogOpened(dialog) + + view.findViewById(R.id.button_no).apply { + this.setOnClickListener { + dialog.dismiss() + } + } + + view.findViewById(R.id.button_yes).apply { + this.setOnClickListener { + try { + val intent = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + val uri = Uri.fromParts("package", context.packageName, null) + intent.data = uri + context.startActivity(intent) + } catch (e: Throwable) { + toast(context, context.getString(R.string.failed_to_show_settings)) + } + + onYes?.invoke() + dialog.dismiss() + } + } + + dialog.setOnDismissListener { + registerDialogClosed(dialog) + } + + dialog.show() + } fun showAutomaticBackupDialog(context: Context, skipRestoreCheck: Boolean = false, onClosed: (()->Unit)? = null) { val dialogAction: ()->Unit = { @@ -107,7 +145,8 @@ class UIDialogs { }, UIDialogs.ActionStyle.DANGEROUS), UIDialogs.Action(context.getString(R.string.restore), { UIDialogs.showAutomaticRestoreDialog(context, StateApp.instance.scope); - }, UIDialogs.ActionStyle.PRIMARY)); + }, UIDialogs.ActionStyle.PRIMARY) + ); else { dialogAction(); } diff --git a/app/src/main/java/com/futo/platformplayer/states/StateAnnouncement.kt b/app/src/main/java/com/futo/platformplayer/states/StateAnnouncement.kt index 76d06783..9bced80b 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateAnnouncement.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateAnnouncement.kt @@ -1,6 +1,7 @@ package com.futo.platformplayer.states import android.content.Context +import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.api.http.ManagedHttpClient import com.futo.platformplayer.constructs.Event0 import com.futo.platformplayer.constructs.Event1 @@ -256,9 +257,6 @@ class StateAnnouncement { } - - - fun registerDidYouKnow() { val random = Random(); val message: String? = when (random.nextInt(4 * 18 + 1)) { @@ -294,6 +292,23 @@ class StateAnnouncement { } } + fun registerDefaultHandlerAnnouncement() { + registerAnnouncement( + "default-url-handler", + "Allow Grayjay to open URLs", + "Click here to allow Grayjay to open URLs", + AnnouncementType.SESSION_RECURRING, + null, + null, + "Allow" + ) { + UIDialogs.showUrlHandlingPrompt(StateApp.instance.context) { + instance.neverAnnouncement("default-url-handler") + instance.onAnnouncementChanged.emit() + } + } + } + companion object { private var _instance: StateAnnouncement? = null; val instance: StateAnnouncement diff --git a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt index c30a4311..bfdc4836 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt @@ -543,6 +543,7 @@ class StateApp { ); } + StateAnnouncement.instance.registerDefaultHandlerAnnouncement(); StateAnnouncement.instance.registerDidYouKnow(); Logger.i(TAG, "MainApp Started: Finished"); } diff --git a/app/src/main/res/layout/dialog_url_handling.xml b/app/src/main/res/layout/dialog_url_handling.xml new file mode 100644 index 00000000..fa860162 --- /dev/null +++ b/app/src/main/res/layout/dialog_url_handling.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8552e9c4..1bb406e4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -292,6 +292,8 @@ Clear external Downloads directory Change external General directory Change tabs visible on the home screen + Link Handling + Allow Grayjay to handle links Change the external directory for general files Clear the external storage for download files Change the external storage for download files @@ -678,6 +680,10 @@ " + Tax" New playlist Add to new playlist + URL Handling + Allow Grayjay to handle specific URLs? + When you click \'Yes\', the Grayjay app settings will open.\n\nThere, navigate to:\n1. "Open by default" or "Set as default" section.\nYou might find this option directly or under \'Advanced\' settings, depending on your device.\n\n2. Choose \'Open supported links\' for Grayjay.\n\n(some devices have this listed under \'Default Apps\' in the main settings followed by selecting Grayjay for relevant categories) + Failed to show settings Recommendations Subscriptions diff --git a/app/src/unstable/AndroidManifest.xml b/app/src/unstable/AndroidManifest.xml index 74db3f15..d053978f 100644 --- a/app/src/unstable/AndroidManifest.xml +++ b/app/src/unstable/AndroidManifest.xml @@ -6,39 +6,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -