diff options
7 files changed, 52 insertions, 4 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 6307477aa766..420bf31a189d 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -608,6 +608,14 @@ public class ActivityManager { public static boolean resizeStackWithLaunchBounds(int stackId) { return stackId == PINNED_STACK_ID; } + + /** + * Returns true if any visible windows belonging to apps in this stack should be kept on + * screen when the app is killed due to something like the low memory killer. + */ + public static boolean keepVisibleDeadAppWindowOnScreen(int stackId) { + return stackId != PINNED_STACK_ID; + } } /** diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 855b21e80260..1e22bef63d8c 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -366,7 +366,7 @@ public final class LoadedApk { } } - String libraryPermittedPath = mAppDir + File.pathSeparator + mDataDir; + String libraryPermittedPath = mDataDir; boolean isBundledApp = false; if (mApplicationInfo.isSystemApp()) { diff --git a/core/java/android/security/NetworkSecurityPolicy.java b/core/java/android/security/NetworkSecurityPolicy.java index 37ec72589570..733a09260ada 100644 --- a/core/java/android/security/NetworkSecurityPolicy.java +++ b/core/java/android/security/NetworkSecurityPolicy.java @@ -16,6 +16,11 @@ package android.security; +import android.content.Context; +import android.content.pm.PackageManager; +import android.security.net.config.ApplicationConfig; +import android.security.net.config.ManifestConfigSource; + /** * Network security policy. * @@ -86,4 +91,17 @@ public class NetworkSecurityPolicy { FrameworkNetworkSecurityPolicy policy = new FrameworkNetworkSecurityPolicy(permitted); libcore.net.NetworkSecurityPolicy.setInstance(policy); } + + + /** + * Returns an {@link ApplicationConfig} based on the configuration for {@code packageName}. + * + * @hide + */ + public static ApplicationConfig getApplicationConfigForPackage(Context context, + String packageName) throws PackageManager.NameNotFoundException { + Context appContext = context.createPackageContext(packageName, 0); + ManifestConfigSource source = new ManifestConfigSource(appContext); + return new ApplicationConfig(source); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java index 8e3886bcb2de..aea9e1e15cd1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java @@ -76,11 +76,11 @@ public class ButtonDispatcher { } public int getVisibility() { - return mVisibility; + return mVisibility != null ? mVisibility : View.VISIBLE; } public float getAlpha() { - return mAlpha; + return mAlpha != null ? mAlpha : 1; } public void setImageDrawable(Drawable drawable) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1021411084c3..5adf6278dd9d 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -2193,7 +2193,7 @@ public class WindowManagerService extends IWindowManager.Stub // need to see about starting one. wasVisible = win.isWinVisibleLw(); - if (wasVisible && appToken != null && appToken.appDied) { + if (win.shouldKeepVisibleDeadAppWindow()) { if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "Not removing " + win + " because app died while it's visible"); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index dca7735f02fc..e8de90c93f0a 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1615,6 +1615,27 @@ final class WindowState implements WindowManagerPolicy.WindowState { } } + /** + * Returns true if this window is visible and belongs to a dead app and shouldn't be removed, + * because we want to preserve its location on screen to be re-activated later when the user + * interacts with it. + */ + boolean shouldKeepVisibleDeadAppWindow() { + if (!isWinVisibleLw() || mAppToken == null || !mAppToken.appDied) { + // Not a visible app window or the app isn't dead. + return false; + } + + if (mAttrs.type == TYPE_APPLICATION_STARTING) { + // We don't keep starting windows since they were added by the window manager before + // the app even launched. + return false; + } + + final TaskStack stack = getStack(); + return stack != null && StackId.keepVisibleDeadAppWindowOnScreen(stack.mStackId); + } + /** @return true if this window desires key events. */ boolean canReceiveKeys() { return isVisibleOrAdding() diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 839299e8b156..0fffd76ec401 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -7895,6 +7895,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature || !isManagedProfile(userHandle)) { return ActiveAdmin.DEF_ORGANIZATION_COLOR; } + Preconditions.checkNotNull(who, "ComponentName is null"); synchronized (this) { ActiveAdmin admin = getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_PROFILE_OWNER); |