Moved AppWarnings handling to ActivityTaskManagerService (15/n)
Also removed CompatModeDialog since it has been disabled for more than
5 years now.
Test: Existing tests pass
Bug: 80414790
Change-Id: Ide697f9f6e6ed176c54bfcc1b800d4dba59c1d06
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 8b25605..aa0315a 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -568,8 +568,6 @@
final AppErrors mAppErrors;
- final AppWarnings mAppWarnings;
-
/**
* Dump of the activity state at the time of the last ANR. Cleared after
* {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
@@ -1451,7 +1449,6 @@
static final int CHECK_EXCESSIVE_POWER_USE_MSG = 27;
static final int CLEAR_DNS_CACHE_MSG = 28;
static final int UPDATE_HTTP_PROXY_MSG = 29;
- static final int SHOW_COMPAT_MODE_DIALOG_UI_MSG = 30;
static final int DISPATCH_PROCESSES_CHANGED_UI_MSG = 31;
static final int DISPATCH_PROCESS_DIED_UI_MSG = 32;
static final int REPORT_MEM_USAGE_MSG = 33;
@@ -1482,7 +1479,6 @@
static ServiceThread sKillThread = null;
static KillHandler sKillHandler = null;
- CompatModeDialog mCompatModeDialog;
long mLastMemUsageReportTime = 0;
/**
@@ -1613,34 +1609,6 @@
}
}
} break;
- case SHOW_COMPAT_MODE_DIALOG_UI_MSG: {
- synchronized (ActivityManagerService.this) {
- ActivityRecord ar = (ActivityRecord) msg.obj;
- if (mCompatModeDialog != null) {
- if (mCompatModeDialog.mAppInfo.packageName.equals(
- ar.info.applicationInfo.packageName)) {
- return;
- }
- mCompatModeDialog.dismiss();
- mCompatModeDialog = null;
- }
- if (ar != null && false) {
- if (mCompatModePackages.getPackageAskCompatModeLocked(
- ar.packageName)) {
- int mode = mCompatModePackages.computeCompatModeLocked(
- ar.info.applicationInfo);
- if (mode == ActivityManager.COMPAT_MODE_DISABLED
- || mode == ActivityManager.COMPAT_MODE_ENABLED) {
- mCompatModeDialog = new CompatModeDialog(
- ActivityManagerService.this, mUiContext,
- ar.info.applicationInfo);
- mCompatModeDialog.show();
- }
- }
- }
- }
- break;
- }
case DISPATCH_PROCESSES_CHANGED_UI_MSG: {
dispatchProcessesChanged();
break;
@@ -2459,7 +2427,6 @@
mUiContext = null;
GL_ES_VERSION = 0;
mAppErrors = null;
- mAppWarnings = null;
mAppOpsService = mInjector.getAppOpsService(null, null);
mBatteryStatsService = null;
mCompatModePackages = null;
@@ -2526,8 +2493,6 @@
final File systemDir = SystemServiceManager.ensureSystemDir();
- mAppWarnings = new AppWarnings(this, mUiContext, mHandler, mUiHandler, systemDir);
-
// TODO: Move creation of battery stats service outside of activity manager service.
mBatteryStatsService = new BatteryStatsService(systemContext, systemDir, mHandler);
mBatteryStatsService.getActiveStatistics().readLocked();
@@ -2917,28 +2882,6 @@
mActivityTaskManager.unregisterTaskStackListener(listener);
}
- final void showAskCompatModeDialogLocked(ActivityRecord r) {
- Message msg = Message.obtain();
- msg.what = SHOW_COMPAT_MODE_DIALOG_UI_MSG;
- msg.obj = r.getTask().askedCompatMode ? null : r;
- mUiHandler.sendMessage(msg);
- }
-
- final AppWarnings getAppWarningsLocked() {
- return mAppWarnings;
- }
-
- /**
- * Shows app warning dialogs, if necessary.
- *
- * @param r activity record for which the warnings may be displayed
- */
- final void showAppWarningsIfNeededLocked(ActivityRecord r) {
- mAppWarnings.showUnsupportedCompileSdkDialogIfNeeded(r);
- mAppWarnings.showUnsupportedDisplaySizeDialogIfNeeded(r);
- mAppWarnings.showDeprecatedTargetDialogIfNeeded(r);
- }
-
private int updateLruProcessInternalLocked(ProcessRecord app, long now, int index,
String what, Object obj, ProcessRecord srcApp) {
app.lastActivityTime = now;
@@ -16373,7 +16316,7 @@
mActivityTaskManager.getRecentTasks().removeTasksByPackageName(ssp, userId);
mServices.forceStopPackageLocked(ssp, userId);
- mAppWarnings.onPackageUninstalled(ssp);
+ mAtmInternal.onPackageUninstalled(ssp);
mCompatModePackages.handlePackageUninstalledLocked(ssp);
mBatteryStatsService.notePackageUninstalled(ssp);
}
@@ -16454,7 +16397,7 @@
String ssp;
if (data != null && (ssp = data.getSchemeSpecificPart()) != null) {
mCompatModePackages.handlePackageDataClearedLocked(ssp);
- mAppWarnings.onPackageDataCleared(ssp);
+ mAtmInternal.onPackageDataCleared(ssp);
}
break;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index c9f239e..bd621ed 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -2817,10 +2817,12 @@
}
results = null;
newIntents = null;
- service.mAm.getAppWarningsLocked().onResumeActivity(this);
- service.mAm.showAskCompatModeDialogLocked(this);
+ service.getAppWarningsLocked().onResumeActivity(this);
} else {
- service.mAm.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this);
+ final ActivityStack stack = getStack();
+ if (stack != null) {
+ stack.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this);
+ }
setState(PAUSED, "relaunchActivityLocked");
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 058c714..cbce3f4 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -2722,8 +2722,7 @@
next.shortComponentName);
next.sleeping = false;
- mService.mAm.getAppWarningsLocked().onResumeActivity(next);
- mService.mAm.showAskCompatModeDialogLocked(next);
+ mService.getAppWarningsLocked().onResumeActivity(next);
next.app.setPendingUiCleanAndForceProcessStateUpTo(mService.mTopProcessState);
next.clearOptionsLocked();
transaction.setLifecycleStateRequest(
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 70ac197..002f718 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1523,8 +1523,7 @@
PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
r.sleeping = false;
r.forceNewConfig = false;
- mService.mAm.getAppWarningsLocked().onStartActivity(r);
- mService.mAm.showAskCompatModeDialogLocked(r);
+ mService.getAppWarningsLocked().onStartActivity(r);
r.compat = mService.mAm.compatibilityInfoForPackageLocked(r.info.applicationInfo);
ProfilerInfo profilerInfo = null;
if (mService.mAm.mProfileApp != null && mService.mAm.mProfileApp.equals(app.processName)) {
diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
index 4a0f692..91f2b5f 100644
--- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java
@@ -132,6 +132,7 @@
import com.android.internal.R;
import com.android.internal.app.IAppOpsService;
import com.android.server.AppOpsService;
+import com.android.server.SystemServiceManager;
import com.android.server.pm.UserManagerService;
import com.android.server.uri.UriGrantsManagerInternal;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -471,6 +472,8 @@
/** If non-null, we are tracking the time the user spends in the currently focused app. */
AppTimeTracker mCurAppTimeTracker;
+ private AppWarnings mAppWarnings;
+
private FontScaleSettingObserver mFontScaleSettingObserver;
private final class FontScaleSettingObserver extends ContentObserver {
@@ -600,6 +603,8 @@
mGlobalLock = mAm;
mH = new H(mAm.mHandlerThread.getLooper());
mUiHandler = new UiHandler();
+ mAppWarnings = new AppWarnings(
+ this, mUiContext, mH, mUiHandler, SystemServiceManager.ensureSystemDir());
mTempConfig.setToDefaults();
mTempConfig.setLocales(LocaleList.getDefault());
@@ -4013,7 +4018,7 @@
synchronized (mGlobalLock) {
final long origId = Binder.clearCallingIdentity();
try {
- mAm.mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity);
+ mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity);
} finally {
Binder.restoreCallingIdentity(origId);
}
@@ -4498,7 +4503,7 @@
final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
if (isDensityChange && displayId == DEFAULT_DISPLAY) {
- mAm.mAppWarnings.onDensityChanged();
+ mAppWarnings.onDensityChanged();
mAm.killAllBackgroundProcessesExcept(N,
ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
@@ -4883,6 +4888,10 @@
return mPmInternal;
}
+ AppWarnings getAppWarningsLocked() {
+ return mAppWarnings;
+ }
+
void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
if (true || Build.IS_USER) {
return;
@@ -5353,5 +5362,19 @@
mPidMap.remove(pid);
}
}
+
+ @Override
+ public void onPackageDataCleared(String name) {
+ synchronized (mGlobalLock) {
+ mAppWarnings.onPackageDataCleared(name);
+ }
+ }
+
+ @Override
+ public void onPackageUninstalled(String name) {
+ synchronized (mGlobalLock) {
+ mAppWarnings.onPackageUninstalled(name);
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/am/AppWarnings.java b/services/core/java/com/android/server/am/AppWarnings.java
index 30a3844..a705180 100644
--- a/services/core/java/com/android/server/am/AppWarnings.java
+++ b/services/core/java/com/android/server/am/AppWarnings.java
@@ -17,7 +17,6 @@
package com.android.server.am;
import android.annotation.UiThread;
-import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Configuration;
@@ -57,9 +56,9 @@
private final HashMap<String, Integer> mPackageFlags = new HashMap<>();
- private final ActivityManagerService mAms;
+ private final ActivityTaskManagerService mAtm;
private final Context mUiContext;
- private final ConfigHandler mAmsHandler;
+ private final ConfigHandler mHandler;
private final UiHandler mUiHandler;
private final AtomicFile mConfigFile;
@@ -81,17 +80,17 @@
* <p>
* <strong>Note:</strong> Must be called from the ActivityManagerService thread.
*
- * @param ams
+ * @param atm
* @param uiContext
- * @param amsHandler
+ * @param handler
* @param uiHandler
* @param systemDir
*/
- public AppWarnings(ActivityManagerService ams, Context uiContext, Handler amsHandler,
+ public AppWarnings(ActivityTaskManagerService atm, Context uiContext, Handler handler,
Handler uiHandler, File systemDir) {
- mAms = ams;
+ mAtm = atm;
mUiContext = uiContext;
- mAmsHandler = new ConfigHandler(amsHandler.getLooper());
+ mHandler = new ConfigHandler(handler.getLooper());
mUiHandler = new UiHandler(uiHandler.getLooper());
mConfigFile = new AtomicFile(new File(systemDir, CONFIG_FILE_NAME), "warnings-config");
@@ -104,7 +103,7 @@
* @param r activity record for which the warning may be displayed
*/
public void showUnsupportedDisplaySizeDialogIfNeeded(ActivityRecord r) {
- final Configuration globalConfig = mAms.getGlobalConfiguration();
+ final Configuration globalConfig = mAtm.getGlobalConfiguration();
if (globalConfig.densityDpi != DisplayMetrics.DENSITY_DEVICE_STABLE
&& r.appInfo.requiresSmallestWidthDp > globalConfig.smallestScreenWidthDp) {
mUiHandler.showUnsupportedDisplaySizeDialog(r);
@@ -211,7 +210,7 @@
synchronized (mPackageFlags) {
mPackageFlags.remove(name);
- mAmsHandler.scheduleWrite();
+ mHandler.scheduleWrite();
}
}
@@ -351,7 +350,7 @@
} else {
mPackageFlags.remove(name);
}
- mAmsHandler.scheduleWrite();
+ mHandler.scheduleWrite();
}
}
}
@@ -430,10 +429,10 @@
}
/**
- * Handles messages on the ActivityManagerService thread.
+ * Handles messages on the ActivityTaskManagerService thread.
*/
private final class ConfigHandler extends Handler {
- private static final int MSG_WRITE = ActivityManagerService.FIRST_COMPAT_MODE_MSG;
+ private static final int MSG_WRITE = 1;
private static final int DELAY_MSG_WRITE = 10000;
diff --git a/services/core/java/com/android/server/am/CompatModeDialog.java b/services/core/java/com/android/server/am/CompatModeDialog.java
deleted file mode 100644
index 202cc7c..0000000
--- a/services/core/java/com/android/server/am/CompatModeDialog.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2011 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.server.am;
-
-import android.app.ActivityManager;
-import android.app.Dialog;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.view.Gravity;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.Switch;
-
-public final class CompatModeDialog extends Dialog {
- final ActivityManagerService mService;
- final ApplicationInfo mAppInfo;
-
- final Switch mCompatEnabled;
- final CheckBox mAlwaysShow;
- final View mHint;
-
- public CompatModeDialog(ActivityManagerService service, Context context,
- ApplicationInfo appInfo) {
- super(context, com.android.internal.R.style.Theme_Holo_Dialog_MinWidth);
- setCancelable(true);
- setCanceledOnTouchOutside(true);
- getWindow().requestFeature(Window.FEATURE_NO_TITLE);
- getWindow().setType(WindowManager.LayoutParams.TYPE_PHONE);
- getWindow().setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL);
- mService = service;
- mAppInfo = appInfo;
-
- setContentView(com.android.internal.R.layout.am_compat_mode_dialog);
- mCompatEnabled = (Switch)findViewById(com.android.internal.R.id.compat_checkbox);
- mCompatEnabled.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- synchronized (mService) {
- mService.mCompatModePackages.setPackageScreenCompatModeLocked(
- mAppInfo.packageName,
- mCompatEnabled.isChecked() ? ActivityManager.COMPAT_MODE_ENABLED
- : ActivityManager.COMPAT_MODE_DISABLED);
- updateControls();
- }
- }
- });
- mAlwaysShow = (CheckBox)findViewById(com.android.internal.R.id.ask_checkbox);
- mAlwaysShow.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- synchronized (mService) {
- mService.mCompatModePackages.setPackageAskCompatModeLocked(
- mAppInfo.packageName, mAlwaysShow.isChecked());
- updateControls();
- }
- }
- });
- mHint = findViewById(com.android.internal.R.id.reask_hint);
-
- updateControls();
- }
-
- void updateControls() {
- synchronized (mService) {
- int mode = mService.mCompatModePackages.computeCompatModeLocked(mAppInfo);
- mCompatEnabled.setChecked(mode == ActivityManager.COMPAT_MODE_ENABLED);
- boolean ask = mService.mCompatModePackages.getPackageAskCompatModeLocked(
- mAppInfo.packageName);
- mAlwaysShow.setChecked(ask);
- mHint.setVisibility(ask ? View.INVISIBLE : View.VISIBLE);
- }
- }
-}