summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/ActivityManager.java8
-rw-r--r--core/java/android/app/LoadedApk.java2
-rw-r--r--core/java/android/security/NetworkSecurityPolicy.java18
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java2
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java21
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java1
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);