From 7bb7e8e7249e7aa154c39d4a2210265307817b87 Mon Sep 17 00:00:00 2001 From: Govinda Wasserman Date: Tue, 23 May 2023 11:54:43 -0400 Subject: Fix ChooserActivity stuck disabled If a device upgrades straight from TM QPR3 to UDC it would get stuck with ChooserActivity disabled. This change returns ChooserActivity to its default enabled/disabled state on boot. This class can be safely removed once there are no longer devices upgrading from TM QPR3. Test: Flash device to TM QPR3 with wipe Test: Fully boot the device Test: Flash device to UDC (including this change) without wipe Test: Fully boot the device Test: $ adb shell pm resolve-activity -a android.intent.action.CHOOSER Test: Observe that the intent resolves to com.android.intentresolver.ChooserActivity BUG: 283722356 FIX: 283722356 Change-Id: I04621bc64fd2b536da40d2b21793e7dc5d91a1c7 --- .../intentresolver/ChooserActivityReEnabler.kt | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 java/src/com/android/intentresolver/ChooserActivityReEnabler.kt (limited to 'java') diff --git a/java/src/com/android/intentresolver/ChooserActivityReEnabler.kt b/java/src/com/android/intentresolver/ChooserActivityReEnabler.kt new file mode 100644 index 00000000..3236c1be --- /dev/null +++ b/java/src/com/android/intentresolver/ChooserActivityReEnabler.kt @@ -0,0 +1,39 @@ +package com.android.intentresolver + +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager + +/** + * Ensures that the unbundled version of [ChooserActivity] does not get stuck in a disabled state. + */ +class ChooserActivityReEnabler : BroadcastReceiver() { + + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Intent.ACTION_BOOT_COMPLETED) { + context.packageManager.setComponentEnabledSetting( + CHOOSER_COMPONENT, + PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, + /* flags = */ 0, + ) + + // This only needs to be run once, so we disable ourself to avoid additional startup + // process on future boots + context.packageManager.setComponentEnabledSetting( + SELF_COMPONENT, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + /* flags = */ 0, + ) + } + } + + companion object { + private const val CHOOSER_PACKAGE = "com.android.intentresolver" + private val CHOOSER_COMPONENT = + ComponentName(CHOOSER_PACKAGE, "$CHOOSER_PACKAGE.ChooserActivity") + private val SELF_COMPONENT = + ComponentName(CHOOSER_PACKAGE, "$CHOOSER_PACKAGE.ChooserActivityReEnabler") + } +} -- cgit v1.2.3-59-g8ed1b