diff options
| author | 2022-02-11 14:00:43 -0800 | |
|---|---|---|
| committer | 2022-02-11 15:42:16 -0800 | |
| commit | bd36a8115cd02cda812d17a6639eb662cad0857e (patch) | |
| tree | 85ae0901d09644bac7775927f597ee3b2cdb3b39 | |
| parent | 0ef7951dee4489b156dd905321f5bfacdbed93c8 (diff) | |
Add ability for sysui/featureflags to restart android
When setting flags/sysprops, full reboot is overkill.
This adds a way to just restart system_server.
Bug: 219067621
Test: Call API and verify that it restarts
Change-Id: I67aecbc6ec0570fbaf36165034648ab39da57940
6 files changed, 47 insertions, 3 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index cce7dd338b3d..8c942b2f0a1a 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -808,4 +808,9 @@ public abstract class ActivityManagerInternal { * Register the bind service event listener callback. */ public abstract void addBindServiceEventListener(@NonNull BindServiceEventListener listener); + + /** + * Restart android. + */ + public abstract void restart(); } diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 0c45e5b3eab4..4f72331f40d9 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -102,6 +102,9 @@ interface IStatusBarService void shutdown(); void reboot(boolean safeMode); + /** just restarts android without rebooting device. Used for some feature flags. */ + void restart(); + void addTile(in ComponentName tile); void remTile(in ComponentName tile); void clickTile(in ComponentName tile); diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java index f3b721c02635..df605990fa81 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java +++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java @@ -30,11 +30,13 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.os.Bundle; +import android.os.RemoteException; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.android.internal.statusbar.IStatusBarService; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; @@ -70,6 +72,7 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { private final Supplier<Map<Integer, Flag<?>>> mFlagsCollector; private final Map<Integer, Boolean> mBooleanFlagCache = new TreeMap<>(); private final Map<Integer, String> mStringFlagCache = new TreeMap<>(); + private final IStatusBarService mBarService; @Inject public FeatureFlagsDebug( @@ -78,7 +81,8 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { SecureSettings secureSettings, @Main Resources resources, DumpManager dumpManager, - @Nullable Supplier<Map<Integer, Flag<?>>> flagsCollector) { + @Nullable Supplier<Map<Integer, Flag<?>>> flagsCollector, + IStatusBarService barService) { mFlagManager = flagManager; mSecureSettings = secureSettings; mResources = resources; @@ -91,6 +95,7 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { context.registerReceiver(mReceiver, filter, null, null, Context.RECEIVER_EXPORTED_UNAUDITED); dumpManager.registerDumpable(TAG, this); + mBarService = barService; } @Override @@ -212,6 +217,14 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable { System.exit(0); } + private void restartAndroid() { + Log.i(TAG, "Restarting Android"); + try { + mBarService.restart(); + } catch (RemoteException e) { + } + } + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt index 87bc732d2f66..4cc5673eaf97 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt @@ -18,10 +18,10 @@ package com.android.systemui.flags import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.content.pm.PackageManager.NameNotFoundException import android.content.res.Resources import androidx.test.filters.SmallTest +import com.android.internal.statusbar.IStatusBarService import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.util.mockito.any @@ -59,6 +59,7 @@ class FeatureFlagsDebugTest : SysuiTestCase() { @Mock private lateinit var mSecureSettings: SecureSettings @Mock private lateinit var mResources: Resources @Mock private lateinit var mDumpManager: DumpManager + @Mock private lateinit var mBarService: IStatusBarService private val mFlagMap = mutableMapOf<Int, Flag<*>>() private lateinit var mBroadcastReceiver: BroadcastReceiver private lateinit var mClearCacheAction: Consumer<Int> @@ -72,7 +73,8 @@ class FeatureFlagsDebugTest : SysuiTestCase() { mSecureSettings, mResources, mDumpManager, - { mFlagMap } + { mFlagMap }, + mBarService ) verify(mFlagManager).restartAction = any() mBroadcastReceiver = withArgCaptor { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2da6fb4a8560..1e141e42f201 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -17122,6 +17122,11 @@ public class ActivityManagerService extends IActivityManager.Stub // It's a CopyOnWriteArrayList, so no lock is needed. mBindServiceEventListeners.add(listener); } + + @Override + public void restart() { + ActivityManagerService.this.restart(); + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, String reason) { diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 94f483c65eb5..26446545ae9d 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -1432,6 +1432,22 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } } + /** + * Allows the status bar to restart android (vs a full reboot). + */ + @Override + public void restart() { + enforceStatusBarService(); + final long identity = Binder.clearCallingIdentity(); + try { + mHandler.post(() -> { + mActivityManagerInternal.restart(); + }); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + @Override public void onGlobalActionsShown() { enforceStatusBarService(); |