summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Evan Rosky <erosky@google.com> 2022-02-11 14:00:43 -0800
committer Evan Rosky <erosky@google.com> 2022-02-11 15:42:16 -0800
commitbd36a8115cd02cda812d17a6639eb662cad0857e (patch)
tree85ae0901d09644bac7775927f597ee3b2cdb3b39
parent0ef7951dee4489b156dd905321f5bfacdbed93c8 (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
-rw-r--r--core/java/android/app/ActivityManagerInternal.java5
-rw-r--r--core/java/com/android/internal/statusbar/IStatusBarService.aidl3
-rw-r--r--packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java15
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsDebugTest.kt6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java5
-rw-r--r--services/core/java/com/android/server/statusbar/StatusBarManagerService.java16
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();