From 0bd014c4977c3c4d35daf3df390cfcdc61d18b3e Mon Sep 17 00:00:00 2001 From: Jason Chiu Date: Mon, 25 Mar 2024 12:15:56 +0800 Subject: [PATCH] [Safer intents] Settings misc To avoid implicit intents, make intents launch explicitly. Test: build Bug: 323061508 Change-Id: Ie19cbceb89842a75a180898abcce81b63c18d46c --- res/xml/more_security_privacy_settings.xml | 3 ++- res/xml/shortcuts.xml | 18 +++++++++------ .../settings/BrightnessPreference.java | 3 ++- .../android/settings/RingtonePreference.java | 3 ++- .../LiveCaptionPreferenceController.java | 1 + .../accounts/AccountPreferenceController.java | 1 + ...erpriseDisclosurePreferenceController.java | 3 ++- .../DashboardFeatureProviderImpl.java | 5 +++-- .../LocationToggleDisabledDialogFragment.java | 3 ++- ...veSleepPermissionPreferenceController.java | 1 + .../BrightnessLevelPreferenceController.java | 2 ++ .../SmartAutoRotatePermissionController.java | 1 + .../EnterprisePrivacyFeatureProviderImpl.java | 22 ------------------- .../flashlight/FlashlightHandleActivity.java | 2 +- .../homepage/SettingsHomepageActivity.java | 2 ++ .../contextualcards/FaceReEnrollDialog.java | 4 ++-- .../AbnormalRingerConditionController.java | 3 ++- .../android/settings/panel/VolumePanel.java | 4 +++- .../security/ScreenPinningSettings.java | 1 + .../slices/SliceDeepLinkSpringBoard.java | 2 +- .../theme/ContrastPreferenceController.kt | 2 ++ .../android/settings/users/UserSettings.java | 3 ++- .../LiveCaptionPreferenceControllerTest.java | 9 +++++++- 23 files changed, 54 insertions(+), 44 deletions(-) diff --git a/res/xml/more_security_privacy_settings.xml b/res/xml/more_security_privacy_settings.xml index 3e11db206b5..d5ce3804b87 100644 --- a/res/xml/more_security_privacy_settings.xml +++ b/res/xml/more_security_privacy_settings.xml @@ -175,7 +175,8 @@ android:title="@string/financed_device_info" android:summary="@string/summary_placeholder" settings:controller="com.android.settings.devicelock.DeviceLockPreferenceController"> - + diff --git a/res/xml/shortcuts.xml b/res/xml/shortcuts.xml index 058d22e9edf..9c9368811a8 100644 --- a/res/xml/shortcuts.xml +++ b/res/xml/shortcuts.xml @@ -14,12 +14,14 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> - + - + android:shortcutShortLabel="@string/wifi_settings"> + + android:targetPackage="${applicationId}" + android:targetClass="com.android.settings.Settings$DataUsageSummaryActivity"/> - + android:shortcutShortLabel="@string/power_usage_summary_title"> + \ No newline at end of file diff --git a/src/com/android/settings/BrightnessPreference.java b/src/com/android/settings/BrightnessPreference.java index b3cf4335789..8c8f3f6d66e 100644 --- a/src/com/android/settings/BrightnessPreference.java +++ b/src/com/android/settings/BrightnessPreference.java @@ -31,7 +31,8 @@ public class BrightnessPreference extends Preference { @Override protected void onClick() { - getContext().startActivityAsUser(new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG), + getContext().startActivityAsUser(new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG) + .setPackage(Utils.SYSTEMUI_PACKAGE_NAME), UserHandle.CURRENT_OR_SELF); } } diff --git a/src/com/android/settings/RingtonePreference.java b/src/com/android/settings/RingtonePreference.java index de5b7c39f76..6b9dad7ffbf 100644 --- a/src/com/android/settings/RingtonePreference.java +++ b/src/com/android/settings/RingtonePreference.java @@ -74,7 +74,8 @@ public class RingtonePreference extends Preference { true); mShowSilent = a.getBoolean(com.android.internal.R.styleable.RingtonePreference_showSilent, true); - setIntent(new Intent(RingtoneManager.ACTION_RINGTONE_PICKER)); + setIntent(new Intent(RingtoneManager.ACTION_RINGTONE_PICKER) + .setPackage(context.getString(R.string.config_sound_picker_package_name))); setUserId(UserHandle.myUserId()); a.recycle(); } diff --git a/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java b/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java index 2d12f67fd78..f5157328ee3 100644 --- a/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java +++ b/src/com/android/settings/accessibility/LiveCaptionPreferenceController.java @@ -39,6 +39,7 @@ public class LiveCaptionPreferenceController extends BasePreferenceController { public LiveCaptionPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); mPackageManager = context.getPackageManager(); + LIVE_CAPTION_INTENT.setPackage(mPackageManager.getSystemCaptionsServicePackageName()); } @Override diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java index 4f03303c372..b120f38e9b1 100644 --- a/src/com/android/settings/accounts/AccountPreferenceController.java +++ b/src/com/android/settings/accounts/AccountPreferenceController.java @@ -256,6 +256,7 @@ public class AccountPreferenceController extends AbstractPreferenceController if (preference == profileData.addAccountPreference) { mMetricsFeatureProvider.logClickedPreference(preference, metricsCategory); Intent intent = new Intent(ACTION_ADD_ACCOUNT); + intent.setClass(mContext, AddAccountSettings.class); intent.putExtra(EXTRA_USER, profileData.userInfo.getUserHandle()); intent.putExtra(EXTRA_AUTHORITIES, mAuthorities); mContext.startActivity(intent); diff --git a/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java b/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java index f7816bb3fd6..33c494be635 100644 --- a/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java +++ b/src/com/android/settings/accounts/EnterpriseDisclosurePreferenceController.java @@ -66,7 +66,8 @@ public class EnterpriseDisclosurePreferenceController extends BasePreferenceCont final FooterPreference footerPreference = screen.findPreference(getPreferenceKey()); footerPreference.setTitle(disclosure); footerPreference.setLearnMoreAction(view -> { - mContext.startActivity(new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS)); + mContext.startActivity(new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS) + .setPackage(mContext.getPackageName())); }); final String learnMoreText = mContext.getString( R.string.footer_learn_more_content_description, getLabelName()); diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 8214d0b06be..b95d927414a 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -223,8 +223,9 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { @Override public void openTileIntent(FragmentActivity activity, Tile tile) { if (tile == null) { - Intent intent = new Intent(Settings.ACTION_SETTINGS).addFlags( - Intent.FLAG_ACTIVITY_CLEAR_TASK); + Intent intent = new Intent(Settings.ACTION_SETTINGS) + .setPackage(mContext.getPackageName()) + .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); mContext.startActivity(intent); return; } diff --git a/src/com/android/settings/datetime/LocationToggleDisabledDialogFragment.java b/src/com/android/settings/datetime/LocationToggleDisabledDialogFragment.java index 046a659d64c..c9362c029ad 100644 --- a/src/com/android/settings/datetime/LocationToggleDisabledDialogFragment.java +++ b/src/com/android/settings/datetime/LocationToggleDisabledDialogFragment.java @@ -42,7 +42,8 @@ public class LocationToggleDisabledDialogFragment extends InstrumentedDialogFrag .setPositiveButton( R.string.location_time_zone_detection_location_is_off_dialog_ok_button, (dialog, which) -> { - Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + .setPackage(getContext().getPackageName()); getContext().startActivity(intent); }) .setNegativeButton( diff --git a/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java b/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java index c3db6f7e3aa..03b9d096a37 100644 --- a/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepPermissionPreferenceController.java @@ -68,6 +68,7 @@ public class AdaptiveSleepPermissionPreferenceController { mContext.getPackageManager().getAttentionServicePackageName(); final Intent intent = new Intent( android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intent.setPackage(mContext.getPackageName()); intent.setData(Uri.parse("package:" + packageName)); mPreference = new BannerMessagePreference(mContext); mPreference.setTitle(R.string.adaptive_sleep_title_no_permission); diff --git a/src/com/android/settings/display/BrightnessLevelPreferenceController.java b/src/com/android/settings/display/BrightnessLevelPreferenceController.java index 468a1d8dd7f..49b8da3d2e3 100644 --- a/src/com/android/settings/display/BrightnessLevelPreferenceController.java +++ b/src/com/android/settings/display/BrightnessLevelPreferenceController.java @@ -39,6 +39,7 @@ import android.text.TextUtils; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.SettingsBaseActivity; import com.android.settingslib.core.AbstractPreferenceController; @@ -145,6 +146,7 @@ public class BrightnessLevelPreferenceController extends AbstractPreferenceContr return false; } final Intent intent = new Intent(ACTION_SHOW_BRIGHTNESS_DIALOG); + intent.setPackage(Utils.SYSTEMUI_PACKAGE_NAME); intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE, SettingsTransitionHelper.TransitionType.TRANSITION_NONE); intent.putExtra(EXTRA_BRIGHTNESS_DIALOG_IS_FULL_WIDTH, true); diff --git a/src/com/android/settings/display/SmartAutoRotatePermissionController.java b/src/com/android/settings/display/SmartAutoRotatePermissionController.java index aa6a96d55da..c45ab11ae0d 100644 --- a/src/com/android/settings/display/SmartAutoRotatePermissionController.java +++ b/src/com/android/settings/display/SmartAutoRotatePermissionController.java @@ -47,6 +47,7 @@ public class SmartAutoRotatePermissionController extends BasePreferenceControlle final String packageName = context.getPackageManager().getRotationResolverPackageName(); mIntent = new Intent( android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + mIntent.setPackage(context.getPackageName()); mIntent.setData(Uri.parse("package:" + packageName)); } diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java index ef542a3590f..0c8f4089628 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -34,8 +34,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; import android.text.SpannableStringBuilder; -import android.text.style.ClickableSpan; -import android.view.View; import com.android.settings.R; import com.android.settings.vpn2.VpnUtils; @@ -303,24 +301,4 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe } return UserHandle.USER_NULL; } - - protected static class EnterprisePrivacySpan extends ClickableSpan { - private final Context mContext; - - public EnterprisePrivacySpan(Context context) { - mContext = context; - } - - @Override - public void onClick(View widget) { - mContext.startActivity(new Intent(Settings.ACTION_ENTERPRISE_PRIVACY_SETTINGS) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } - - @Override - public boolean equals(Object object) { - return object instanceof EnterprisePrivacySpan - && ((EnterprisePrivacySpan) object).mContext == mContext; - } - } } diff --git a/src/com/android/settings/flashlight/FlashlightHandleActivity.java b/src/com/android/settings/flashlight/FlashlightHandleActivity.java index 6740da438cf..6ae07cdcea4 100644 --- a/src/com/android/settings/flashlight/FlashlightHandleActivity.java +++ b/src/com/android/settings/flashlight/FlashlightHandleActivity.java @@ -52,7 +52,7 @@ public class FlashlightHandleActivity extends Activity implements Indexable { // Caller's choice: fallback to homepage, or just exit? if (getIntent().getBooleanExtra(EXTRA_FALLBACK_TO_HOMEPAGE, false)) { - startActivity(new Intent(Settings.ACTION_SETTINGS)); + startActivity(new Intent(Settings.ACTION_SETTINGS).setPackage(getPackageName())); } finish(); } diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 5f091d99e61..801679992a6 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -208,6 +208,8 @@ public class SettingsHomepageActivity extends FragmentActivity implements if (TextUtils.equals(intent.getAction(), ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY) && this instanceof DeepLinkHomepageActivity) { intent.setClass(this, DeepLinkHomepageActivityInternal.class); + } else { + intent.setPackage(getPackageName()); } intent.removeFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivityAsUser(intent, um.getProfileParent(userInfo.id).getUserHandle()); diff --git a/src/com/android/settings/homepage/contextualcards/FaceReEnrollDialog.java b/src/com/android/settings/homepage/contextualcards/FaceReEnrollDialog.java index a8239241bf5..e2eb6ec0070 100644 --- a/src/com/android/settings/homepage/contextualcards/FaceReEnrollDialog.java +++ b/src/com/android/settings/homepage/contextualcards/FaceReEnrollDialog.java @@ -113,8 +113,8 @@ public class FaceReEnrollDialog extends AlertActivity implements return; } // Send user to the enroll flow. - final Intent reEnroll = new Intent(BIOMETRIC_ENROLL_ACTION); - final Context context = getApplicationContext(); + final Intent reEnroll = new Intent(BIOMETRIC_ENROLL_ACTION) + .setPackage(getPackageName()); try { startActivity(reEnroll); diff --git a/src/com/android/settings/homepage/contextualcards/conditional/AbnormalRingerConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/AbnormalRingerConditionController.java index 6a66d2f9556..f8cfbea657e 100644 --- a/src/com/android/settings/homepage/contextualcards/conditional/AbnormalRingerConditionController.java +++ b/src/com/android/settings/homepage/contextualcards/conditional/AbnormalRingerConditionController.java @@ -42,7 +42,8 @@ public abstract class AbnormalRingerConditionController implements ConditionalCa @Override public void onPrimaryClick(Context context) { - context.startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS)); + context.startActivity(new Intent(Settings.ACTION_SOUND_SETTINGS) + .setPackage(context.getPackageName())); } @Override diff --git a/src/com/android/settings/panel/VolumePanel.java b/src/com/android/settings/panel/VolumePanel.java index 1a53de098e0..4f38504d5e6 100644 --- a/src/com/android/settings/panel/VolumePanel.java +++ b/src/com/android/settings/panel/VolumePanel.java @@ -151,7 +151,9 @@ public class VolumePanel implements PanelContent, LifecycleObserver { @Override public Intent getSeeMoreIntent() { - return new Intent(Settings.ACTION_SOUND_SETTINGS).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return new Intent(Settings.ACTION_SOUND_SETTINGS) + .setPackage(mContext.getPackageName()) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } @Override diff --git a/src/com/android/settings/security/ScreenPinningSettings.java b/src/com/android/settings/security/ScreenPinningSettings.java index 8690847b4d0..4d3743c4ed0 100644 --- a/src/com/android/settings/security/ScreenPinningSettings.java +++ b/src/com/android/settings/security/ScreenPinningSettings.java @@ -142,6 +142,7 @@ public class ScreenPinningSettings extends SettingsPreferenceFragment if (isEnabled) { if (passwordQuality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); + chooseLockIntent.setPackage(getContext().getPackageName()); chooseLockIntent.putExtra( ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true); diff --git a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java index 852f2861860..e89f2c9f7e7 100644 --- a/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java +++ b/src/com/android/settings/slices/SliceDeepLinkSpringBoard.java @@ -67,7 +67,7 @@ public class SliceDeepLinkSpringBoard extends Activity { finish(); } catch (Exception e) { Log.w(TAG, "Couldn't launch Slice intent", e); - startActivity(new Intent(Settings.ACTION_SETTINGS)); + startActivity(new Intent(Settings.ACTION_SETTINGS).setPackage(getPackageName())); finish(); } } diff --git a/src/com/android/settings/theme/ContrastPreferenceController.kt b/src/com/android/settings/theme/ContrastPreferenceController.kt index 7f3844a9dd4..7478ab63327 100644 --- a/src/com/android/settings/theme/ContrastPreferenceController.kt +++ b/src/com/android/settings/theme/ContrastPreferenceController.kt @@ -26,6 +26,7 @@ import android.text.TextUtils import androidx.preference.Preference import com.android.internal.annotations.VisibleForTesting import com.android.settings.R +import com.android.settings.Utils import com.android.settings.core.BasePreferenceController /** @@ -47,6 +48,7 @@ class ContrastPreferenceController( override fun handlePreferenceTreeClick(preference: Preference): Boolean { if (TextUtils.equals(preference.key, preferenceKey)) { val intent = Intent(Intent.ACTION_SHOW_CONTRAST_DIALOG) + intent.setPackage(Utils.SYSTEMUI_PACKAGE_NAME) context.startActivityAsUser(intent, UserHandle(UserHandle.USER_CURRENT)) return true } diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index 70d8ed371ef..83dc1274c06 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -555,7 +555,8 @@ public class UserSettings extends SettingsPreferenceFragment } private void launchChooseLockscreen() { - Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); + Intent chooseLockIntent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD) + .setPackage(getContext().getPackageName()); chooseLockIntent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS, true); startActivityForResult(chooseLockIntent, REQUEST_CHOOSE_LOCK); diff --git a/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java index a7a7f8f0cbe..314aeff5e9c 100644 --- a/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/LiveCaptionPreferenceControllerTest.java @@ -21,7 +21,11 @@ import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_ import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + import android.content.Context; +import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.provider.Settings; @@ -48,7 +52,10 @@ public class LiveCaptionPreferenceControllerTest { @Before public void setUp() { - mContext = ApplicationProvider.getApplicationContext(); + mContext = spy(ApplicationProvider.getApplicationContext()); + PackageManager pm = spy(mContext.getPackageManager()); + doReturn(pm).when(mContext).getPackageManager(); + doReturn("com.caption").when(pm).getSystemCaptionsServicePackageName(); mController = new LiveCaptionPreferenceController(mContext, "test_key"); mLiveCaptionPreference = new Preference(mContext); mLiveCaptionPreference.setSummary(R.string.live_caption_summary);