diff --git a/res/xml/apps.xml b/res/xml/apps.xml index c4313f645e4..f50f86aeb6b 100644 --- a/res/xml/apps.xml +++ b/res/xml/apps.xml @@ -58,9 +58,7 @@ android:key="default_apps" android:title="@string/app_default_dashboard_title" android:order="-996" - settings:controller="com.android.settings.applications.DefaultAppsPreferenceController"> - - + settings:controller="com.android.settings.applications.DefaultAppsPreferenceController"/> - - + settings:controller="com.android.settings.applications.HibernatedAppsPreferenceController"/> - - - - + settings:controller="com.android.settings.location.AppLocationPermissionPreferenceController"/> - - - - + settings:controller="com.android.settings.location.AppLocationPermissionPreferenceController"/> - - - - + settings:controller="com.android.settings.location.AppLocationPermissionPreferenceController"/> - - + settings:controller="com.android.settings.privacy.AccessibilityUsagePreferenceController"/> - - + settings:controller="com.android.settings.privacy.AccessibilityUsagePreferenceController"/> - - + settings:controller="com.android.settings.privacy.PrivacyHubPreferenceController"/> - - + android:summary="@string/runtime_permissions_summary_control_app_access" + settings:controller="com.android.settings.privacy.ManagePermissionsPreferenceController"/> - - + settings:controller="com.android.settings.privacy.AppDataSharingUpdatesPreferenceController"/> diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 2f6f04af6ac..00ffc26c080 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -140,7 +140,8 @@ public class Settings extends SettingsActivity { if (SafetyCenterManagerWrapper.get().isEnabled(this)) { try { - startActivity(new Intent(Intent.ACTION_SAFETY_CENTER)); + startActivity(new Intent(Intent.ACTION_SAFETY_CENTER) + .setPackage(getPackageManager().getPermissionControllerPackageName())); finish(); } catch (ActivityNotFoundException e) { Log.e(TAG, "Unable to open safety center", e); @@ -235,7 +236,8 @@ public class Settings extends SettingsActivity { if (ACTION_PRIVACY_SETTINGS.equals(getIntent().getAction()) && SafetyCenterManagerWrapper.get().isEnabled(this)) { try { - startActivity(new Intent(Intent.ACTION_SAFETY_CENTER)); + startActivity(new Intent(Intent.ACTION_SAFETY_CENTER) + .setPackage(getPackageManager().getPermissionControllerPackageName())); finish(); } catch (ActivityNotFoundException e) { Log.e(TAG, "Unable to open safety center", e); diff --git a/src/com/android/settings/applications/DefaultAppsPreferenceController.java b/src/com/android/settings/applications/DefaultAppsPreferenceController.java index c5b849d6dc0..6320db694a0 100644 --- a/src/com/android/settings/applications/DefaultAppsPreferenceController.java +++ b/src/com/android/settings/applications/DefaultAppsPreferenceController.java @@ -18,11 +18,16 @@ package com.android.settings.applications; import android.app.role.RoleManager; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.icu.text.ListFormatter; +import android.provider.Settings; import android.text.TextUtils; +import androidx.annotation.NonNull; import androidx.core.text.BidiFormatter; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.applications.AppUtils; @@ -47,6 +52,17 @@ public class DefaultAppsPreferenceController extends BasePreferenceController { return AVAILABLE; } + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) + .setPackage(mPackageManager.getPermissionControllerPackageName())); + } + } + @Override public CharSequence getSummary() { final List defaultAppLabels = new ArrayList<>(); diff --git a/src/com/android/settings/applications/HibernatedAppsPreferenceController.java b/src/com/android/settings/applications/HibernatedAppsPreferenceController.java index eb6edb27314..d85f8aa2740 100644 --- a/src/com/android/settings/applications/HibernatedAppsPreferenceController.java +++ b/src/com/android/settings/applications/HibernatedAppsPreferenceController.java @@ -21,6 +21,7 @@ import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION; import static com.android.settings.Utils.PROPERTY_APP_HIBERNATION_ENABLED; import android.content.Context; +import android.content.Intent; import android.icu.text.MessageFormat; import android.permission.PermissionControllerManager; import android.provider.DeviceConfig; @@ -85,6 +86,12 @@ public final class HibernatedAppsPreferenceController extends BasePreferenceCont public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mScreen = screen; + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Intent.ACTION_MANAGE_UNUSED_APPS) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName())); + } } /** diff --git a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java index b7069d9df7f..6ba4e467363 100644 --- a/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppPermissionPreferenceController.java @@ -132,6 +132,7 @@ public class AppPermissionPreferenceController extends AppInfoPreferenceControll private void startManagePermissionsActivity() { // start new activity to manage app permissions final Intent permIntent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); + permIntent.setPackage(mPackageManager.getPermissionControllerPackageName()); permIntent.putExtra(Intent.EXTRA_PACKAGE_NAME, mParent.getAppEntry().info.packageName); permIntent.putExtra(EXTRA_HIDE_INFO_BUTTON, true); Activity activity = mParent.getActivity(); diff --git a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java index 5a1883b3361..184f907b13f 100644 --- a/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java +++ b/src/com/android/settings/applications/appinfo/DefaultAppShortcutPreferenceControllerBase.java @@ -105,6 +105,7 @@ public abstract class DefaultAppShortcutPreferenceControllerBase extends BasePre return false; } final Intent intent = new Intent(Intent.ACTION_MANAGE_DEFAULT_APP) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName()) .putExtra(Intent.EXTRA_ROLE_NAME, mRoleName); mContext.startActivity(intent); return true; diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index c2fabff680d..b392d9a6b2d 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -921,7 +921,9 @@ public class ManageApplications extends InstrumentedFragment .setResultListener(this, ADVANCED_SETTINGS) .launch(); } else { - Intent intent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS); + Intent intent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) + .setPackage(getContext() + .getPackageManager().getPermissionControllerPackageName()); startActivityForResult(intent, ADVANCED_SETTINGS); } return true; diff --git a/src/com/android/settings/applications/specialaccess/DefaultPaymentSettingsPreferenceController.java b/src/com/android/settings/applications/specialaccess/DefaultPaymentSettingsPreferenceController.java index c66c97e2e59..c76e4487060 100644 --- a/src/com/android/settings/applications/specialaccess/DefaultPaymentSettingsPreferenceController.java +++ b/src/com/android/settings/applications/specialaccess/DefaultPaymentSettingsPreferenceController.java @@ -71,7 +71,8 @@ public class DefaultPaymentSettingsPreferenceController extends BasePreferenceCo && mPreferenceKey.equals(preference.getKey())) { RoleManager roleManager = mContext.getSystemService(RoleManager.class); if (roleManager.isRoleAvailable(RoleManager.ROLE_WALLET)) { - Intent intent = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT); + Intent intent = new Intent(CardEmulation.ACTION_CHANGE_DEFAULT) + .setPackage(mPackageManager.getPermissionControllerPackageName()); mContext.startActivity(intent); return true; } diff --git a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java index 37bbd08fb18..6a61e1a7b01 100644 --- a/src/com/android/settings/location/AppLocationPermissionPreferenceController.java +++ b/src/com/android/settings/location/AppLocationPermissionPreferenceController.java @@ -4,14 +4,18 @@ import static android.Manifest.permission.ACCESS_COARSE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import android.content.Context; +import android.content.Intent; import android.location.LocationManager; import android.os.UserHandle; import android.os.UserManager; import android.permission.PermissionControllerManager; import android.provider.Settings; +import android.text.TextUtils; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.Utils; @@ -69,6 +73,21 @@ public class AppLocationPermissionPreferenceController extends } } + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Intent.ACTION_MANAGE_PERMISSION_APPS) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName()) + .putExtra(TextUtils.equals(pref.getKey(), "app_level_permissions") + ? Intent.EXTRA_PERMISSION_NAME + : Intent.EXTRA_PERMISSION_GROUP_NAME, + "android.permission-group.LOCATION")); + } + } + private void setAppCounts(int numTotal, int numHasLocation) { mNumTotal = numTotal; mNumHasLocation = numHasLocation; diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java index 61682d00a8c..a5c0e55a74d 100644 --- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java @@ -67,6 +67,7 @@ public class RecentLocationAccessPreferenceController extends LocationBasePrefer @Override public boolean onPreferenceClick(Preference preference) { final Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSION); + intent.setPackage(mContext.getPackageManager().getPermissionControllerPackageName()); intent.putExtra(Intent.EXTRA_PERMISSION_GROUP_NAME, LOCATION); intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mPackage); intent.putExtra(Intent.EXTRA_USER, mUserHandle); diff --git a/src/com/android/settings/privacy/AccessibilityUsagePreferenceController.java b/src/com/android/settings/privacy/AccessibilityUsagePreferenceController.java index a78ccee26e7..6a46a981db6 100644 --- a/src/com/android/settings/privacy/AccessibilityUsagePreferenceController.java +++ b/src/com/android/settings/privacy/AccessibilityUsagePreferenceController.java @@ -18,10 +18,12 @@ package com.android.settings.privacy; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.Context; +import android.content.Intent; import android.view.accessibility.AccessibilityManager; import androidx.annotation.NonNull; import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; @@ -64,4 +66,15 @@ public class AccessibilityUsagePreferenceController extends BasePreferenceContro return StringUtil.getIcuPluralsString(mContext, mEnabledServiceInfos.size(), R.string.accessibility_usage_summary); } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Intent.ACTION_REVIEW_ACCESSIBILITY_SERVICES) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName())); + } + } } diff --git a/src/com/android/settings/privacy/AppDataSharingUpdatesPreferenceController.java b/src/com/android/settings/privacy/AppDataSharingUpdatesPreferenceController.java index 5372a16d61e..5d634eb403b 100644 --- a/src/com/android/settings/privacy/AppDataSharingUpdatesPreferenceController.java +++ b/src/com/android/settings/privacy/AppDataSharingUpdatesPreferenceController.java @@ -19,9 +19,14 @@ package com.android.settings.privacy; import static android.safetylabel.SafetyLabelConstants.SAFETY_LABEL_CHANGE_NOTIFICATIONS_ENABLED; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageManager; import android.provider.DeviceConfig; +import androidx.annotation.NonNull; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + import com.android.settings.core.BasePreferenceController; /** @@ -34,6 +39,17 @@ public class AppDataSharingUpdatesPreferenceController extends BasePreferenceCon super(context, preferenceKey); } + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Intent.ACTION_REVIEW_APP_DATA_SHARING_UPDATES) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName())); + } + } + @Override public int getAvailabilityStatus() { return isPrivacySafetyLabelChangeNotificationsEnabled(mContext) diff --git a/src/com/android/settings/privacy/ManagePermissionsPreferenceController.java b/src/com/android/settings/privacy/ManagePermissionsPreferenceController.java new file mode 100644 index 00000000000..441c5c9d11b --- /dev/null +++ b/src/com/android/settings/privacy/ManagePermissionsPreferenceController.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.privacy; + +import android.content.Context; +import android.content.Intent; + +import androidx.annotation.NonNull; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; + +/** + * The preference controller for managing permissions + */ +public class ManagePermissionsPreferenceController extends BasePreferenceController { + + public ManagePermissionsPreferenceController(@NonNull Context context, + @NonNull String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Intent.ACTION_MANAGE_PERMISSIONS) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName())); + } + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } +} diff --git a/src/com/android/settings/privacy/PrivacyHubPreferenceController.java b/src/com/android/settings/privacy/PrivacyHubPreferenceController.java index b68b5ec7d0e..20e5290bcf9 100644 --- a/src/com/android/settings/privacy/PrivacyHubPreferenceController.java +++ b/src/com/android/settings/privacy/PrivacyHubPreferenceController.java @@ -17,9 +17,12 @@ package com.android.settings.privacy; import android.content.Context; +import android.content.Intent; import android.provider.DeviceConfig; import androidx.annotation.NonNull; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; @@ -38,4 +41,15 @@ public final class PrivacyHubPreferenceController extends BasePreferenceControll return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, PROPERTY_PRIVACY_HUB_ENABLED, true) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } + + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + + Preference pref = screen.findPreference(getPreferenceKey()); + if (pref != null) { + pref.setIntent(new Intent(Intent.ACTION_REVIEW_PERMISSION_USAGE) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName())); + } + } } diff --git a/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceController.java b/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceController.java index af9509bf7cc..64d78b84378 100644 --- a/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceController.java +++ b/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceController.java @@ -50,7 +50,8 @@ public class TopLevelSafetyCenterEntryPreferenceController extends BasePreferenc } try { - mContext.startActivity(new Intent(Intent.ACTION_SAFETY_CENTER)); + mContext.startActivity(new Intent(Intent.ACTION_SAFETY_CENTER) + .setPackage(mContext.getPackageManager().getPermissionControllerPackageName())); } catch (ActivityNotFoundException e) { Log.e(TAG, "Unable to open safety center", e); return false; diff --git a/tests/unit/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceControllerTest.java b/tests/unit/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceControllerTest.java index 25cd774ea05..b376825eb33 100644 --- a/tests/unit/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/safetycenter/TopLevelSafetyCenterEntryPreferenceControllerTest.java @@ -20,13 +20,16 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import androidx.preference.Preference; import androidx.test.core.app.ApplicationProvider; @@ -52,7 +55,6 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest { @Mock private SafetyCenterManagerWrapper mSafetyCenterManagerWrapper; - @Mock private Context mContext; @Before @@ -60,7 +62,12 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest { MockitoAnnotations.initMocks(this); SafetyCenterManagerWrapper.sInstance = mSafetyCenterManagerWrapper; - mPreference = new Preference(ApplicationProvider.getApplicationContext()); + mContext = spy(ApplicationProvider.getApplicationContext()); + PackageManager pm = spy(mContext.getPackageManager()); + doReturn(pm).when(mContext).getPackageManager(); + doReturn("com.android.permissioncontroller").when(pm).getPermissionControllerPackageName(); + + mPreference = new Preference(mContext); mPreference.setKey(PREFERENCE_KEY); doNothing().when(mContext).startActivity(any(Intent.class)); @@ -75,7 +82,7 @@ public class TopLevelSafetyCenterEntryPreferenceControllerTest { @Test public void handlePreferenceTreeClick_forDifferentPreferenceKey_isNotHandled() { - Preference preference = new Preference(ApplicationProvider.getApplicationContext()); + Preference preference = new Preference(mContext); preference.setKey("some_other_preference"); boolean preferenceHandled = diff --git a/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java b/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java index 82112c96807..0e51733b90f 100644 --- a/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java +++ b/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java @@ -20,6 +20,8 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -27,6 +29,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.platform.app.InstrumentationRegistry; @@ -80,6 +83,10 @@ public class SecurityDashboardActivityTest { } }); doNothing().when(mActivity).startActivity(any(Intent.class)); + + PackageManager pm = mock(PackageManager.class); + doReturn(pm).when(mActivity).getPackageManager(); + doReturn("com.android.permissioncontroller").when(pm).getPermissionControllerPackageName(); } @Test