diff options
21 files changed, 186 insertions, 101 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 9711e06e5c16..32d87c9d3195 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -766,9 +766,19 @@ public class Activity extends ContextThemeWrapper private static final String REQUEST_PERMISSIONS_WHO_PREFIX = "@android:requestPermissions:"; private static final String AUTO_FILL_AUTH_WHO_PREFIX = "@android:autoFillAuth:"; - private static final String KEYBOARD_SHORTCUTS_RECEIVER_PKG_NAME = "com.android.systemui"; + private static final int LOG_AM_ON_CREATE_CALLED = 30057; + private static final int LOG_AM_ON_START_CALLED = 30059; + private static final int LOG_AM_ON_RESUME_CALLED = 30022; + private static final int LOG_AM_ON_PAUSE_CALLED = 30021; + private static final int LOG_AM_ON_STOP_CALLED = 30049; + private static final int LOG_AM_ON_RESTART_CALLED = 30058; + private static final int LOG_AM_ON_DESTROY_CALLED = 30060; + private static final int LOG_AM_ON_ACTIVITY_RESULT_CALLED = 30062; + private static final int LOG_AM_ON_TOP_RESUMED_GAINED_CALLED = 30064; + private static final int LOG_AM_ON_TOP_RESUMED_LOST_CALLED = 30065; + private static class ManagedDialog { Dialog mDialog; Bundle mArgs; @@ -2439,8 +2449,11 @@ public class Activity extends ContextThemeWrapper * {@link #onProvideKeyboardShortcuts} to retrieve the shortcuts for the foreground activity. */ public final void requestShowKeyboardShortcuts() { + final ComponentName sysuiComponent = ComponentName.unflattenFromString( + getResources().getString( + com.android.internal.R.string.config_systemUIServiceComponent)); Intent intent = new Intent(Intent.ACTION_SHOW_KEYBOARD_SHORTCUTS); - intent.setPackage(KEYBOARD_SHORTCUTS_RECEIVER_PKG_NAME); + intent.setPackage(sysuiComponent.getPackageName()); sendBroadcastAsUser(intent, Process.myUserHandle()); } @@ -2448,8 +2461,11 @@ public class Activity extends ContextThemeWrapper * Dismiss the Keyboard Shortcuts screen. */ public final void dismissKeyboardShortcutsHelper() { + final ComponentName sysuiComponent = ComponentName.unflattenFromString( + getResources().getString( + com.android.internal.R.string.config_systemUIServiceComponent)); Intent intent = new Intent(Intent.ACTION_DISMISS_KEYBOARD_SHORTCUTS); - intent.setPackage(KEYBOARD_SHORTCUTS_RECEIVER_PKG_NAME); + intent.setPackage(sysuiComponent.getPackageName()); sendBroadcastAsUser(intent, Process.myUserHandle()); } diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java index 5e530eedd818..bd1eea51f8af 100644 --- a/core/java/android/app/slice/SliceProvider.java +++ b/core/java/android/app/slice/SliceProvider.java @@ -515,8 +515,8 @@ public abstract class SliceProvider extends ContentProvider { public static PendingIntent createPermissionIntent(Context context, Uri sliceUri, String callingPackage) { Intent intent = new Intent(SliceManager.ACTION_REQUEST_SLICE_PERMISSION); - intent.setComponent(new ComponentName("com.android.systemui", - "com.android.systemui.SlicePermissionActivity")); + intent.setComponent(ComponentName.unflattenFromString(context.getResources().getString( + com.android.internal.R.string.config_slicePermissionComponent))); intent.putExtra(EXTRA_BIND_URI, sliceUri); intent.putExtra(EXTRA_PKG, callingPackage); intent.putExtra(EXTRA_PROVIDER_PKG, context.getPackageName()); diff --git a/core/java/android/service/dreams/Sandman.java b/core/java/android/service/dreams/Sandman.java index efb8923a459f..f2cedbc7aa92 100644 --- a/core/java/android/service/dreams/Sandman.java +++ b/core/java/android/service/dreams/Sandman.java @@ -36,12 +36,6 @@ import android.util.Slog; public final class Sandman { private static final String TAG = "Sandman"; - // The component name of a special dock app that merely launches a dream. - // We don't want to launch this app when docked because it causes an unnecessary - // activity transition. We just want to start the dream. - private static final ComponentName SOMNAMBULATOR_COMPONENT = - new ComponentName("com.android.systemui", "com.android.systemui.Somnambulator"); - // The sandman is eternal. No one instantiates him. private Sandman() { @@ -52,8 +46,11 @@ public final class Sandman { * False if we should dream instead, if appropriate. */ public static boolean shouldStartDockApp(Context context, Intent intent) { + final ComponentName somnambulatorComponent = ComponentName.unflattenFromString( + context.getResources().getString( + com.android.internal.R.string.config_somnambulatorComponent)); ComponentName name = intent.resolveActivity(context.getPackageManager()); - return name != null && !name.equals(SOMNAMBULATOR_COMPONENT); + return name != null && !name.equals(somnambulatorComponent); } /** diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index dd2586cd58ad..d0675ed4b99a 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -481,9 +481,12 @@ public class TileService extends Service { * as true on their TileService Manifest declaration, and will do nothing otherwise. */ public static final void requestListeningState(Context context, ComponentName component) { + final ComponentName sysuiComponent = ComponentName.unflattenFromString( + context.getResources().getString( + com.android.internal.R.string.config_systemUIServiceComponent)); Intent intent = new Intent(ACTION_REQUEST_LISTENING); intent.putExtra(Intent.EXTRA_COMPONENT_NAME, component); - intent.setPackage("com.android.systemui"); + intent.setPackage(sysuiComponent.getPackageName()); context.sendBroadcast(intent, Manifest.permission.BIND_QUICK_SETTINGS_TILE); } } diff --git a/core/java/com/android/internal/util/ScreenRecordHelper.java b/core/java/com/android/internal/util/ScreenRecordHelper.java index 64d089848b7d..ec7ed4e0008a 100644 --- a/core/java/com/android/internal/util/ScreenRecordHelper.java +++ b/core/java/com/android/internal/util/ScreenRecordHelper.java @@ -24,10 +24,6 @@ import android.content.Intent; * Helper class to initiate a screen recording */ public class ScreenRecordHelper { - private static final String SYSUI_PACKAGE = "com.android.systemui"; - private static final String SYSUI_SCREENRECORD_LAUNCHER = - "com.android.systemui.screenrecord.ScreenRecordDialog"; - private final Context mContext; /** @@ -42,8 +38,9 @@ public class ScreenRecordHelper { * Show dialog of screen recording options to user. */ public void launchRecordPrompt() { - final ComponentName launcherComponent = new ComponentName(SYSUI_PACKAGE, - SYSUI_SCREENRECORD_LAUNCHER); + final ComponentName launcherComponent = ComponentName.unflattenFromString( + mContext.getResources().getString( + com.android.internal.R.string.config_screenRecorderComponent)); final Intent intent = new Intent(); intent.setComponent(launcherComponent); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/core/java/com/android/internal/util/ScreenshotHelper.java b/core/java/com/android/internal/util/ScreenshotHelper.java index f6f187fd27c5..8cad5a0d1d09 100644 --- a/core/java/com/android/internal/util/ScreenshotHelper.java +++ b/core/java/com/android/internal/util/ScreenshotHelper.java @@ -20,12 +20,6 @@ import java.util.function.Consumer; public class ScreenshotHelper { private static final String TAG = "ScreenshotHelper"; - private static final String SYSUI_PACKAGE = "com.android.systemui"; - private static final String SYSUI_SCREENSHOT_SERVICE = - "com.android.systemui.screenshot.TakeScreenshotService"; - private static final String SYSUI_SCREENSHOT_ERROR_RECEIVER = - "com.android.systemui.screenshot.ScreenshotServiceErrorReceiver"; - // Time until we give up on the screenshot & show an error instead. private final int SCREENSHOT_TIMEOUT_MS = 10000; @@ -94,8 +88,9 @@ public class ScreenshotHelper { if (mScreenshotConnection != null) { return; } - final ComponentName serviceComponent = new ComponentName(SYSUI_PACKAGE, - SYSUI_SCREENSHOT_SERVICE); + final ComponentName serviceComponent = ComponentName.unflattenFromString( + mContext.getResources().getString( + com.android.internal.R.string.config_screenshotServiceComponent)); final Intent serviceIntent = new Intent(); final Runnable mScreenshotTimeout = new Runnable() { @@ -181,8 +176,9 @@ public class ScreenshotHelper { */ private void notifyScreenshotError() { // If the service process is killed, then ask it to clean up after itself - final ComponentName errorComponent = new ComponentName(SYSUI_PACKAGE, - SYSUI_SCREENSHOT_ERROR_RECEIVER); + final ComponentName errorComponent = ComponentName.unflattenFromString( + mContext.getResources().getString( + com.android.internal.R.string.config_screenshotErrorReceiverComponent)); // Broadcast needs to have a valid action. We'll just pick // a generic one, since the receiver here doesn't care. Intent errorIntent = new Intent(Intent.ACTION_USER_PRESENT); diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 89c913b8f580..093bee5cc4e7 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2544,6 +2544,28 @@ <string name="config_customAdbPublicKeyConfirmationSecondaryUserComponent" >com.android.systemui/com.android.systemui.usb.UsbDebuggingSecondaryUserActivity</string> + <!-- Component name of the activity that shows the usb containment status. --> + <string name="config_usbContaminantActivity" translatable="false" + >com.android.systemui/com.android.systemui.usb.UsbContaminantActivity</string> + + <!-- Component name of the activity that shows the request for access to a usb device. --> + <string name="config_usbPermissionActivity" translatable="false" + >com.android.systemui/com.android.systemui.usb.UsbPermissionActivity</string> + + <!-- Component name of the activity that shows more information about a usb accessory. --> + <string name="config_usbAccessoryUriActivity" translatable="false" + >com.android.systemui/com.android.systemui.usb.UsbAccessoryUriActivity</string> + + <!-- Component name of the activity that confirms the activity to start when a usb device is + plugged in. --> + <string name="config_usbConfirmActivity" translatable="false" + >com.android.systemui/com.android.systemui.usb.UsbConfirmActivity</string> + + <!-- Component name of the activity to select the activity to start when a usb device is plugged + in. --> + <string name="config_usbResolverActivity" translatable="false" + >com.android.systemui/com.android.systemui.usb.UsbResolverActivity</string> + <!-- Name of the dialog that is used to request the user's consent to VPN connection --> <string name="config_customVpnConfirmDialogComponent" translatable="false" >com.android.vpndialogs/com.android.vpndialogs.ConfirmDialog</string> @@ -2662,11 +2684,45 @@ property. If this is false, then the following recents config flags are ignored. --> <bool name="config_hasRecents">true</bool> - <!-- Component name for the activity that will be presenting the Recents UI, which will receive special permissions for API related - to fetching and presenting recent tasks. The default configuration uses Launcehr3QuickStep as default launcher and points to - the corresponding recents component. When using a different default launcher, change this appropriately or use the default - systemui implementation: com.android.systemui/.recents.RecentsActivity --> - <string name="config_recentsComponentName" translatable="false">com.android.launcher3/com.android.quickstep.RecentsActivity</string> + <!-- Component name for the activity that will be presenting the Recents UI, which will receive + special permissions for API related to fetching and presenting recent tasks. The default + configuration uses Launcehr3QuickStep as default launcher and points to the corresponding + recents component. When using a different default launcher, change this appropriately or + use the default systemui implementation: com.android.systemui/.recents.RecentsActivity --> + <string name="config_recentsComponentName" translatable="false" + >com.android.launcher3/com.android.quickstep.RecentsActivity</string> + + <!-- SystemUi service component --> + <string name="config_systemUIServiceComponent" translatable="false" + >com.android.systemui/com.android.systemui.SystemUIService</string> + + <!-- Keyguard component --> + <string name="config_keyguardComponent" translatable="false" + >com.android.systemui/com.android.systemui.keyguard.KeyguardService</string> + + <!-- Screen record dialog component --> + <string name="config_screenRecorderComponent" translatable="false" + >com.android.systemui/com.android.systemui.screenrecord.ScreenRecordDialog</string> + + <!-- The component name of a special dock app that merely launches a dream. + We don't want to launch this app when docked because it causes an unnecessary + activity transition. We just want to start the dream. --> + <string name="config_somnambulatorComponent" translatable="false" + >com.android.systemui/com.android.systemui.Somnambulator</string> + + <!-- The component name of a special dock app that merely launches a dream. + We don't want to launch this app when docked because it causes an unnecessary + activity transition. We just want to start the dream.. --> + <string name="config_screenshotServiceComponent" translatable="false" + >com.android.systemui/com.android.systemui.screenshot.TakeScreenshotService</string> + + <!-- The component notified when there is an error while taking a screenshot. --> + <string name="config_screenshotErrorReceiverComponent" translatable="false" + >com.android.systemui/com.android.systemui.screenshot.ScreenshotServiceErrorReceiver</string> + + <!-- The component for the activity shown to grant permissions for a slice. --> + <string name="config_slicePermissionComponent" translatable="false" + >com.android.systemui/com.android.systemui.SlicePermissionActivity</string> <!-- The minimum number of visible recent tasks to be presented to the user through the SystemUI. Can be -1 if there is no minimum limit. --> @@ -3020,9 +3076,6 @@ <!-- Specifies the maximum burn-in offset vertically. --> <integer name="config_burnInProtectionMaxVerticalOffset">0</integer> - <!-- Keyguard component --> - <string name="config_keyguardComponent" translatable="false">com.android.systemui/com.android.systemui.keyguard.KeyguardService</string> - <!-- Limit for the number of face templates per user --> <integer name="config_faceMaxTemplatesPerUser">1</integer> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 6956c39375a2..70e8d9b7de6e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -360,6 +360,17 @@ <java-symbol type="bool" name="config_use16BitTaskSnapshotPixelFormat" /> <java-symbol type="bool" name="config_hasRecents" /> <java-symbol type="string" name="config_recentsComponentName" /> + <java-symbol type="string" name="config_systemUIServiceComponent" /> + <java-symbol type="string" name="config_screenRecorderComponent" /> + <java-symbol type="string" name="config_somnambulatorComponent" /> + <java-symbol type="string" name="config_screenshotServiceComponent" /> + <java-symbol type="string" name="config_screenshotErrorReceiverComponent" /> + <java-symbol type="string" name="config_slicePermissionComponent" /> + <java-symbol type="string" name="config_usbContaminantActivity" /> + <java-symbol type="string" name="config_usbPermissionActivity" /> + <java-symbol type="string" name="config_usbAccessoryUriActivity" /> + <java-symbol type="string" name="config_usbConfirmActivity" /> + <java-symbol type="string" name="config_usbResolverActivity" /> <java-symbol type="integer" name="config_minNumVisibleRecentTasks_lowRam" /> <java-symbol type="integer" name="config_maxNumVisibleRecentTasks_lowRam" /> <java-symbol type="integer" name="config_minNumVisibleRecentTasks_grid" /> diff --git a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java index e16d1caa98eb..1472b9034249 100644 --- a/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java +++ b/core/tests/screenshothelpertests/src/com/android/internal/util/ScreenshotHelperTest.java @@ -24,8 +24,13 @@ import static junit.framework.Assert.fail; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import android.content.Context; +import android.content.res.Resources; import android.os.Handler; import android.os.Looper; @@ -54,9 +59,15 @@ public final class ScreenshotHelperTest { // This raises a `SecurityException` if the device is locked. Calling either `Context` // method results in a broadcast of `android.intent.action. USER_PRESENT`. Only the system // process is allowed to broadcast that `Intent`. + Resources res = mock(Resources.class); mContext = Mockito.spy(Context.class); - Mockito.doNothing().when(mContext).sendBroadcastAsUser(any(), any()); - Mockito.doReturn(true).when(mContext).bindServiceAsUser(any(), any(), anyInt(), any()); + doNothing().when(mContext).sendBroadcastAsUser(any(), any()); + doReturn(true).when(mContext).bindServiceAsUser(any(), any(), anyInt(), any()); + doReturn(res).when(mContext).getResources(); + doReturn("com.android.systemui/.Service").when(res).getString( + eq(com.android.internal.R.string.config_screenshotServiceComponent)); + doReturn("com.android.systemui/.ErrorReceiver").when(res).getString( + eq(com.android.internal.R.string.config_screenshotErrorReceiverComponent)); mHandler = new Handler(Looper.getMainLooper()); mScreenshotHelper = new ScreenshotHelper(mContext); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 35147049e43e..a8318d6a6717 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -28,11 +28,6 @@ android:glEsVersion="0x00020000" android:required="true" /> - <!-- SysUI must be the one to define this permission; its name is - referenced by the core OS. --> - <permission android:name="android.permission.systemui.IDENTITY" - android:protectionLevel="signature" /> - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!-- Used to read wallpaper --> diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 53f306bae8e5..f79b876ec0ce 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -275,6 +275,11 @@ public abstract class PackageManagerInternal { public abstract ComponentName getDefaultHomeActivity(int userId); /** + * @return The SystemUI service component name. + */ + public abstract ComponentName getSystemUiServiceComponent(); + + /** * Called by DeviceOwnerManagerService to set the package names of device owner and profile * owners. */ diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 1e5b91502029..73b6c7a570ed 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -22,6 +22,8 @@ import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE; import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED; import static android.app.AlarmManager.RTC; import static android.app.AlarmManager.RTC_WAKEUP; +import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; +import static android.os.UserHandle.USER_SYSTEM; import android.annotation.UserIdInt; import android.app.Activity; @@ -41,10 +43,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.PermissionInfo; +import android.content.pm.PackageManagerInternal; import android.database.ContentObserver; import android.net.Uri; import android.os.BatteryManager; @@ -223,15 +222,6 @@ class AlarmManagerService extends SystemService { long mLastTimeChangeRealtime; int mNumTimeChanged; - // Bookkeeping about the identity of the "System UI" package, determined at runtime. - - /** - * This permission must be defined by the canonical System UI package, - * with protection level "signature". - */ - private static final String SYSTEM_UI_SELF_PERMISSION = - "android.permission.systemui.IDENTITY"; - /** * At boot we use SYSTEM_UI_SELF_PERMISSION to look up the definer's uid. */ @@ -3201,7 +3191,7 @@ class AlarmManagerService extends SystemService { } void removeUserLocked(int userHandle) { - if (userHandle == UserHandle.USER_SYSTEM) { + if (userHandle == USER_SYSTEM) { // If we're told we're removing the system user, ignore it. return; } @@ -3845,21 +3835,9 @@ class AlarmManagerService extends SystemService { } int getSystemUiUid() { - int sysUiUid = -1; - final PackageManager pm = mContext.getPackageManager(); - try { - PermissionInfo sysUiPerm = pm.getPermissionInfo(SYSTEM_UI_SELF_PERMISSION, 0); - ApplicationInfo sysUi = pm.getApplicationInfo(sysUiPerm.packageName, 0); - if ((sysUi.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0) { - sysUiUid = sysUi.uid; - } else { - Slog.e(TAG, "SysUI permission " + SYSTEM_UI_SELF_PERMISSION - + " defined by non-privileged app " + sysUi.packageName - + " - ignoring"); - } - } catch (NameNotFoundException e) { - } - return sysUiUid; + PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); + return pm.getPackageUid(pm.getSystemUiServiceComponent().getPackageName(), + MATCH_SYSTEM_ONLY, USER_SYSTEM); } ClockReceiver getClockReceiver(AlarmManagerService service) { diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 119b987f7ae7..470300e6485c 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -16,6 +16,9 @@ package com.android.server; +import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; +import static android.os.UserHandle.USER_SYSTEM; + import android.Manifest; import android.app.ActivityManager; import android.app.AppGlobals; @@ -42,6 +45,7 @@ import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.pm.UserInfo; import android.database.ContentObserver; import android.os.Binder; @@ -242,10 +246,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } // DISALLOW_BLUETOOTH can only be set by DO or PO on the system user. - if (userId == UserHandle.USER_SYSTEM + if (userId == USER_SYSTEM && UserRestrictionsUtils.restrictionsChanged(prevRestrictions, newRestrictions, UserManager.DISALLOW_BLUETOOTH)) { - if (userId == UserHandle.USER_SYSTEM && newRestrictions.getBoolean( + if (userId == USER_SYSTEM && newRestrictions.getBoolean( UserManager.DISALLOW_BLUETOOTH)) { updateOppLauncherComponentState(userId, true); // Sharing disallowed sendDisableMsg(BluetoothProtoEnums.ENABLE_DISABLE_REASON_DISALLOWED, @@ -437,18 +441,18 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } int systemUiUid = -1; - try { - // Check if device is configured with no home screen, which implies no SystemUI. - boolean noHome = mContext.getResources().getBoolean(R.bool.config_noHomeScreen); - if (!noHome) { - systemUiUid = mContext.getPackageManager() - .getPackageUidAsUser("com.android.systemui", PackageManager.MATCH_SYSTEM_ONLY, - UserHandle.USER_SYSTEM); - } + // Check if device is configured with no home screen, which implies no SystemUI. + boolean noHome = mContext.getResources().getBoolean(R.bool.config_noHomeScreen); + if (!noHome) { + PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); + systemUiUid = pm.getPackageUid(pm.getSystemUiServiceComponent().getPackageName(), + MATCH_SYSTEM_ONLY, USER_SYSTEM); + } + if (systemUiUid >= 0) { Slog.d(TAG, "Detected SystemUiUid: " + Integer.toString(systemUiUid)); - } catch (PackageManager.NameNotFoundException e) { + } else { // Some platforms, such as wearables do not have a system ui. - Slog.w(TAG, "Unable to resolve SystemUI's UID.", e); + Slog.w(TAG, "Unable to resolve SystemUI's UID."); } mSystemUiUid = systemUiUid; } diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 3330882cc07d..f6c11cd1d0d6 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.res.Resources; import android.database.ContentObserver; import android.hardware.input.InputManager; @@ -79,7 +80,6 @@ public class VibratorService extends IVibratorService.Stub implements InputManager.InputDeviceListener { private static final String TAG = "VibratorService"; private static final boolean DEBUG = false; - private static final String SYSTEM_UI_PACKAGE = "com.android.systemui"; private static final String EXTERNAL_VIBRATOR_SERVICE = "external_vibrator_service"; private static final String RAMPING_RINGER_ENABLED = "ramping_ringer_enabled"; @@ -139,6 +139,7 @@ public class VibratorService extends IVibratorService.Stub private final PowerManager.WakeLock mWakeLock; private final AppOpsManager mAppOps; private final IBatteryStats mBatteryStatsService; + private final String mSystemUiPackage; private PowerManagerInternal mPowerManagerInternal; private InputManager mIm; private Vibrator mVibrator; @@ -284,7 +285,7 @@ public class VibratorService extends IVibratorService.Stub } public boolean isFromSystem() { - return uid == Process.SYSTEM_UID || uid == 0 || SYSTEM_UI_PACKAGE.equals(opPkg); + return uid == Process.SYSTEM_UID || uid == 0 || mSystemUiPackage.equals(opPkg); } public VibrationInfo toInfo() { @@ -372,6 +373,8 @@ public class VibratorService extends IVibratorService.Stub mAppOps = mContext.getSystemService(AppOpsManager.class); mBatteryStatsService = IBatteryStats.Stub.asInterface(ServiceManager.getService( BatteryStats.SERVICE_NAME)); + mSystemUiPackage = LocalServices.getService(PackageManagerInternal.class) + .getSystemUiServiceComponent().getPackageName(); mPreviousVibrationsLimit = mContext.getResources().getInteger( com.android.internal.R.integer.config_previousVibrationsDumpLimit); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 17b1daf34983..3ef7c882fddd 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -22747,6 +22747,12 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public ComponentName getSystemUiServiceComponent() { + return ComponentName.unflattenFromString(mContext.getResources().getString( + com.android.internal.R.string.config_systemUIServiceComponent)); + } + + @Override public void setDeviceAndProfileOwnerPackages( int deviceOwnerUserId, String deviceOwnerPackage, SparseArray<String> profileOwnerPackages) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index eb1753bdbee7..2be84193dd39 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -13737,8 +13737,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } else { deviceOwner.lastNetworkLoggingNotificationTimeMs = now; } + final PackageManagerInternal pm = mInjector.getPackageManagerInternal(); final Intent intent = new Intent(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG); - intent.setPackage("com.android.systemui"); + intent.setPackage(pm.getSystemUiServiceComponent().getPackageName()); final PendingIntent pendingIntent = PendingIntent.getBroadcastAsUser(mContext, 0, intent, 0, UserHandle.CURRENT); Notification notification = diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 6e29b6339e56..1bec19028161 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -30,12 +30,12 @@ import android.app.ActivityThread; import android.app.AppCompatCallbacks; import android.app.INotificationManager; import android.app.usage.UsageStatsManagerInternal; -import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.content.res.Configuration; import android.content.res.Resources.Theme; import android.database.sqlite.SQLiteCompatibilityWalFlags; @@ -2392,9 +2392,9 @@ public final class SystemServer { } private static void startSystemUi(Context context, WindowManagerService windowManager) { + PackageManagerInternal pm = LocalServices.getService(PackageManagerInternal.class); Intent intent = new Intent(); - intent.setComponent(new ComponentName("com.android.systemui", - "com.android.systemui.SystemUIService")); + intent.setComponent(pm.getSystemUiServiceComponent()); intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING); //Slog.d(TAG, "Starting service: " + intent); context.startServiceAsUser(intent, UserHandle.SYSTEM); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java index 7a2350eb4402..919a3f6d7d1b 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/MockSystemServices.java @@ -35,6 +35,7 @@ import android.app.timedetector.TimeDetector; import android.app.timezonedetector.TimeZoneDetector; import android.app.usage.UsageStatsManagerInternal; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.ContentValues; import android.content.Context; import android.content.Intent; @@ -162,6 +163,8 @@ public class MockSystemServices { // Package manager is huge, so we use a partial mock instead. packageManager = spy(realContext.getPackageManager()); + when(packageManagerInternal.getSystemUiServiceComponent()).thenReturn( + new ComponentName("com.android.systemui", ".Service")); contentResolver = new MockContentResolver(); contentResolver.addProvider("telephony", new MockContentProvider(realContext) { diff --git a/services/usb/java/com/android/server/usb/UsbHandlerManager.java b/services/usb/java/com/android/server/usb/UsbHandlerManager.java index 1730d8f22950..f3112743bcf2 100644 --- a/services/usb/java/com/android/server/usb/UsbHandlerManager.java +++ b/services/usb/java/com/android/server/usb/UsbHandlerManager.java @@ -19,6 +19,7 @@ package com.android.server.usb; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ActivityNotFoundException; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; @@ -59,8 +60,9 @@ class UsbHandlerManager { if (uri != null && uri.length() > 0) { // display URI to user Intent dialogIntent = createDialogIntent(); - dialogIntent.setClassName("com.android.systemui", - "com.android.systemui.usb.UsbAccessoryUriActivity"); + dialogIntent.setComponent(ComponentName.unflattenFromString( + mContext.getResources().getString( + com.android.internal.R.string.config_usbAccessoryUriActivity))); dialogIntent.putExtra(UsbManager.EXTRA_ACCESSORY, accessory); dialogIntent.putExtra("uri", uri); try { @@ -84,8 +86,9 @@ class UsbHandlerManager { @Nullable UsbAccessory accessory) { Intent resolverIntent = createDialogIntent(); // start UsbConfirmActivity if there is only one choice - resolverIntent.setClassName("com.android.systemui", - "com.android.systemui.usb.UsbConfirmActivity"); + resolverIntent.setComponent(ComponentName.unflattenFromString( + mContext.getResources().getString( + com.android.internal.R.string.config_usbConfirmActivity))); resolverIntent.putExtra("rinfo", rInfo); UserHandle user = UserHandle.getUserHandleForUid(rInfo.activityInfo.applicationInfo.uid); @@ -115,8 +118,9 @@ class UsbHandlerManager { void selectUsbHandler(@NonNull ArrayList<ResolveInfo> matches, @NonNull UserHandle user, @NonNull Intent intent) { Intent resolverIntent = createDialogIntent(); - resolverIntent.setClassName("com.android.systemui", - "com.android.systemui.usb.UsbResolverActivity"); + resolverIntent.setComponent(ComponentName.unflattenFromString( + mContext.getResources().getString( + com.android.internal.R.string.config_usbResolverActivity))); resolverIntent.putParcelableArrayListExtra("rlist", matches); resolverIntent.putExtra(Intent.EXTRA_INTENT, intent); diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index 749258e76f79..c3e2013eff10 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -34,6 +34,7 @@ import android.annotation.NonNull; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -225,8 +226,8 @@ public class UsbPortManager { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.setClassName("com.android.systemui", - "com.android.systemui.usb.UsbContaminantActivity"); + intent.setComponent(ComponentName.unflattenFromString(r.getString( + com.android.internal.R.string.config_usbContaminantActivity))); intent.putExtra(UsbManager.EXTRA_PORT, ParcelableUsbPort.of(currentPortInfo.mUsbPort)); PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, diff --git a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java index 58f5484657c5..2a94393b8009 100644 --- a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java +++ b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; import android.content.ActivityNotFoundException; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -515,8 +516,8 @@ class UsbUserPermissionManager { intent.putExtra(Intent.EXTRA_UID, uid); intent.putExtra(UsbManager.EXTRA_CAN_BE_DEFAULT, canBeDefault); intent.putExtra(UsbManager.EXTRA_PACKAGE, packageName); - intent.setClassName("com.android.systemui", - "com.android.systemui.usb.UsbPermissionActivity"); + intent.setComponent(ComponentName.unflattenFromString(userContext.getResources().getString( + com.android.internal.R.string.config_usbPermissionActivity))); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { |