diff options
| author | 2024-10-01 15:07:49 -0700 | |
|---|---|---|
| committer | 2024-10-08 13:58:43 -0700 | |
| commit | f2bfad266d24d479f7a692483a84d819335e589c (patch) | |
| tree | 504b57696c00cfd729b169cf1a778e47c6d6c9f0 | |
| parent | 19131b50f3875935a5cc8d163075cab7cb95f5a7 (diff) | |
Adding functionality to open by default settings dialog
Allows the user to change how links open by default (either in the app
or in the default browser) by choosing the setting from the dialog.
Bug: 359262490
Test: manual testing
Flag: com.android.window.flags.enable_desktop_windowing_app_to_web
Change-Id: I573c234df65e829179c10728c3b194eb755f42be
| -rw-r--r-- | libs/WindowManager/Shell/AndroidManifest.xml | 1 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml (renamed from libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml) | 0 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml | 4 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt | 29 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt | 32 | ||||
| -rw-r--r-- | libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt | 10 |
6 files changed, 70 insertions, 6 deletions
diff --git a/libs/WindowManager/Shell/AndroidManifest.xml b/libs/WindowManager/Shell/AndroidManifest.xml index 3b739c3d5817..1260796810c2 100644 --- a/libs/WindowManager/Shell/AndroidManifest.xml +++ b/libs/WindowManager/Shell/AndroidManifest.xml @@ -24,6 +24,7 @@ <uses-permission android:name="android.permission.WAKEUP_SURFACE_FLINGER" /> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" /> + <uses-permission android:name="android.permission.UPDATE_DOMAIN_VERIFICATION_USER_SELECTION" /> <application> <activity diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml index 2b2e9df07dce..2b2e9df07dce 100644 --- a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml +++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml diff --git a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml index 8ff382bbc7b4..b5bceda9a623 100644 --- a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml +++ b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml @@ -111,7 +111,7 @@ </RadioGroup> <Button - android:id="@+id/open_by_default_settings_dialog_dismiss_button" + android:id="@+id/open_by_default_settings_dialog_confirm_button" android:layout_width="wrap_content" android:layout_height="36dp" android:text="@string/open_by_default_dialog_dismiss_button_text" @@ -122,7 +122,7 @@ android:textSize="14sp" android:textFontWeight="500" android:textColor="?androidprv:attr/materialColorOnPrimary" - android:background="@drawable/open_by_default_settings_dialog_dismiss_button_background"/> + android:background="@drawable/open_by_default_settings_dialog_confirm_button_background"/> </LinearLayout> </ScrollView> </FrameLayout> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt index 71bcb590ae23..65132fe89063 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt @@ -22,7 +22,13 @@ import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.pm.PackageManager +import android.content.pm.verify.domain.DomainVerificationManager +import android.content.pm.verify.domain.DomainVerificationUserState import android.net.Uri +import com.android.internal.protolog.ProtoLog +import com.android.wm.shell.protolog.ShellProtoLogGroup + +private const val TAG = "AppToWebUtils" private val GenericBrowserIntent = Intent() .setAction(Intent.ACTION_VIEW) @@ -58,4 +64,25 @@ fun getBrowserIntent(uri: Uri, packageManager: PackageManager): Intent? { val component = intent.resolveActivity(packageManager) ?: return null intent.setComponent(component) return intent -}
\ No newline at end of file +} + +/** + * Returns the [DomainVerificationUserState] of the user associated with the given + * [DomainVerificationManager] and the given package. + */ +fun getDomainVerificationUserState( + manager: DomainVerificationManager, + packageName: String +): DomainVerificationUserState? { + try { + return manager.getDomainVerificationUserState(packageName) + } catch (e: PackageManager.NameNotFoundException) { + ProtoLog.w( + ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, + "%s: Failed to get domain verification user state: %s", + TAG, + e.message!! + ) + return null + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt index 4926cbdbe9fb..a727b54b3a3f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt @@ -19,6 +19,7 @@ package com.android.wm.shell.apptoweb import android.app.ActivityManager.RunningTaskInfo import android.app.TaskInfo import android.content.Context +import android.content.pm.verify.domain.DomainVerificationManager import android.graphics.Bitmap import android.graphics.PixelFormat import android.view.LayoutInflater @@ -30,6 +31,7 @@ import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL import android.view.WindowlessWindowManager import android.widget.ImageView +import android.widget.RadioButton import android.widget.TextView import android.window.TaskConstants import com.android.wm.shell.R @@ -58,8 +60,17 @@ internal class OpenByDefaultDialog( private lateinit var appIconView: ImageView private lateinit var appNameView: TextView + private lateinit var openInAppButton: RadioButton + private lateinit var openInBrowserButton: RadioButton + + private val domainVerificationManager = + context.getSystemService(DomainVerificationManager::class.java)!! + private val packageName = taskInfo.baseActivity?.packageName!! + + init { createDialog() + initializeRadioButtons() bindAppInfo(appIconBitmap, appName) } @@ -111,9 +122,30 @@ internal class OpenByDefaultDialog( closeMenu() } + dialog.setConfirmButtonClickListener { + setDefaultLinkHandlingSetting() + closeMenu() + } + listener.onDialogCreated() } + private fun initializeRadioButtons() { + openInAppButton = dialog.requireViewById(R.id.open_in_app_button) + openInBrowserButton = dialog.requireViewById(R.id.open_in_browser_button) + + val userState = + getDomainVerificationUserState(domainVerificationManager, packageName) ?: return + val openInApp = userState.isLinkHandlingAllowed + openInAppButton.isChecked = openInApp + openInBrowserButton.isChecked = !openInApp + } + + private fun setDefaultLinkHandlingSetting() { + domainVerificationManager.setDomainVerificationLinkHandlingAllowed( + packageName, openInAppButton.isChecked) + } + private fun closeMenu() { dialogContainer?.releaseView() dialogContainer = null diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt index d03a38e8699a..1b914f419d94 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt @@ -36,9 +36,6 @@ class OpenByDefaultDialogView @JvmOverloads constructor( private lateinit var backgroundDim: Drawable fun setDismissOnClickListener(callback: (View) -> Unit) { - val dismissButton = dialogContainer.requireViewById<Button>( - R.id.open_by_default_settings_dialog_dismiss_button) - dismissButton.setOnClickListener(callback) // Clicks on the background dim should also dismiss the dialog. setOnClickListener(callback) // We add a no-op on-click listener to the dialog container so that clicks on it won't @@ -46,6 +43,13 @@ class OpenByDefaultDialogView @JvmOverloads constructor( dialogContainer.setOnClickListener { } } + fun setConfirmButtonClickListener(callback: (View) -> Unit) { + val dismissButton = dialogContainer.requireViewById<Button>( + R.id.open_by_default_settings_dialog_confirm_button + ) + dismissButton.setOnClickListener(callback) + } + override fun onFinishInflate() { super.onFinishInflate() dialogContainer = requireViewById(R.id.open_by_default_dialog_container) |