Merge "Backport overlay security fix" into oc-dev
This commit is contained in:
@@ -120,6 +120,7 @@ package android {
|
||||
field public static final java.lang.String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
|
||||
field public static final java.lang.String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
|
||||
field public static final java.lang.String HDMI_CEC = "android.permission.HDMI_CEC";
|
||||
field public static final java.lang.String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
|
||||
field public static final java.lang.String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
|
||||
field public static final java.lang.String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
|
||||
field public static final java.lang.String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
|
||||
|
||||
@@ -1380,15 +1380,13 @@ public interface WindowManager extends ViewManager {
|
||||
public static final int PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE = 0x00040000;
|
||||
|
||||
/**
|
||||
* Flag to indicate that this window is used as a task snapshot window. A task snapshot
|
||||
* window is a starting window that gets shown with a screenshot from the previous state
|
||||
* that is active until the app has drawn its first frame.
|
||||
*
|
||||
* <p>If this flag is set, SystemUI flags are ignored such that the real window behind can
|
||||
* set the SystemUI flags.
|
||||
* Flag to indicate that any window added by an application process that is of type
|
||||
* {@link #TYPE_TOAST} or that requires
|
||||
* {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when
|
||||
* this window is visible.
|
||||
* @hide
|
||||
*/
|
||||
public static final int PRIVATE_FLAG_TASK_SNAPSHOT = 0x00080000;
|
||||
public static final int PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS = 0x00080000;
|
||||
|
||||
/**
|
||||
* Control flags that are private to the platform.
|
||||
|
||||
@@ -2333,6 +2333,15 @@
|
||||
<permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"
|
||||
android:protectionLevel="signature" />
|
||||
|
||||
<!-- @SystemApi Allows an application to use
|
||||
{@link android.view.WindowManager.LayoutsParams#PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS}
|
||||
to hide non-system-overlay windows.
|
||||
<p>Not for use by third-party applications.
|
||||
@hide
|
||||
-->
|
||||
<permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"
|
||||
android:protectionLevel="signature|installer" />
|
||||
|
||||
<!-- @SystemApi Allows an application to manage (create, destroy,
|
||||
Z-order) application tokens in the window manager.
|
||||
<p>Not for use by third-party applications.
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.server.wm;
|
||||
|
||||
import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||
@@ -82,6 +83,7 @@ public class Session extends IWindowSession.Stub
|
||||
// Set of visible alert window surfaces connected to this session.
|
||||
private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
|
||||
final boolean mCanAddInternalSystemWindow;
|
||||
final boolean mCanHideNonSystemOverlayWindows;
|
||||
private AlertWindowNotification mAlertWindowNotification;
|
||||
private boolean mShowingAlertWindowNotificationAllowed;
|
||||
private boolean mClientDead = false;
|
||||
@@ -99,6 +101,8 @@ public class Session extends IWindowSession.Stub
|
||||
mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
|
||||
mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
|
||||
INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
|
||||
mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
|
||||
HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
|
||||
mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Session{");
|
||||
|
||||
@@ -32,7 +32,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
|
||||
import static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
|
||||
import static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_STATUS_BAR_BACKGROUND;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
|
||||
import static com.android.internal.policy.DecorView.NAVIGATION_BAR_COLOR_VIEW_ATTRIBUTES;
|
||||
import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIBUTES;
|
||||
@@ -164,8 +163,7 @@ class TaskSnapshotSurface implements StartingSurface {
|
||||
layoutParams.flags = (windowFlags & ~FLAG_INHERIT_EXCLUDES)
|
||||
| FLAG_NOT_FOCUSABLE
|
||||
| FLAG_NOT_TOUCHABLE;
|
||||
layoutParams.privateFlags = PRIVATE_FLAG_TASK_SNAPSHOT
|
||||
| (windowPrivateFlags & PRIVATE_FLAG_INHERITS);
|
||||
layoutParams.privateFlags = windowPrivateFlags & PRIVATE_FLAG_INHERITS;
|
||||
layoutParams.token = token.token;
|
||||
layoutParams.width = LayoutParams.MATCH_PARENT;
|
||||
layoutParams.height = LayoutParams.MATCH_PARENT;
|
||||
|
||||
@@ -28,7 +28,6 @@ import static android.content.Intent.EXTRA_USER_HANDLE;
|
||||
import static android.os.Process.ROOT_UID;
|
||||
import static android.os.Process.SHELL_UID;
|
||||
import static android.os.Process.SYSTEM_UID;
|
||||
import static android.os.Process.THREAD_PRIORITY_DISPLAY;
|
||||
import static android.os.Process.myPid;
|
||||
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
|
||||
import static android.os.UserHandle.USER_NULL;
|
||||
@@ -48,7 +47,6 @@ import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHA
|
||||
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
|
||||
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
|
||||
@@ -228,7 +226,6 @@ import com.android.server.DisplayThread;
|
||||
import com.android.server.EventLogTags;
|
||||
import com.android.server.FgThread;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.ThreadPriorityBooster;
|
||||
import com.android.server.UiThread;
|
||||
import com.android.server.Watchdog;
|
||||
import com.android.server.input.InputManagerService;
|
||||
@@ -493,12 +490,15 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
*/
|
||||
Runnable mWaitingForDrawnCallback;
|
||||
|
||||
/** List of window currently causing non-system overlay windows to be hidden. */
|
||||
private ArrayList<WindowState> mHidingNonSystemOverlayWindows = new ArrayList<>();
|
||||
|
||||
/**
|
||||
* Stores for each user whether screencapture is disabled
|
||||
* This array is essentially a cache for all userId for
|
||||
* {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled}
|
||||
*/
|
||||
SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>();
|
||||
private SparseArray<Boolean> mScreenCaptureDisabled = new SparseArray<>();
|
||||
|
||||
IInputMethodManager mInputMethodManager;
|
||||
|
||||
@@ -1435,6 +1435,9 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty();
|
||||
win.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows);
|
||||
|
||||
final AppWindowToken aToken = token.asAppWindowToken();
|
||||
if (type == TYPE_APPLICATION_STARTING && aToken != null) {
|
||||
aToken.startingWindow = win;
|
||||
@@ -1708,6 +1711,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
mPendingRemove.remove(win);
|
||||
mResizingWindows.remove(win);
|
||||
updateNonSystemOverlayWindowsVisibilityIfNeeded(win, false /* surfaceShown */);
|
||||
mWindowsChanged = true;
|
||||
if (DEBUG_WINDOW_MOVEMENT) Slog.v(TAG_WM, "Final remove of window: " + win);
|
||||
|
||||
@@ -6414,6 +6418,21 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
ArrayList<WindowState> windows) {
|
||||
mRoot.dumpWindowsNoHeader(pw, dumpAll, windows);
|
||||
|
||||
if (!mHidingNonSystemOverlayWindows.isEmpty()) {
|
||||
pw.println();
|
||||
pw.println(" Hiding System Alert Windows:");
|
||||
for (int i = mHidingNonSystemOverlayWindows.size() - 1; i >= 0; i--) {
|
||||
final WindowState w = mHidingNonSystemOverlayWindows.get(i);
|
||||
pw.print(" #"); pw.print(i); pw.print(' ');
|
||||
pw.print(w);
|
||||
if (dumpAll) {
|
||||
pw.println(":");
|
||||
w.dump(pw, " ", true);
|
||||
} else {
|
||||
pw.println();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mPendingRemove.size() > 0) {
|
||||
pw.println();
|
||||
pw.println(" Remove pending for:");
|
||||
@@ -7519,4 +7538,28 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) {
|
||||
if (!win.hideNonSystemOverlayWindowsWhenVisible()) {
|
||||
return;
|
||||
}
|
||||
final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty();
|
||||
if (surfaceShown) {
|
||||
if (!mHidingNonSystemOverlayWindows.contains(win)) {
|
||||
mHidingNonSystemOverlayWindows.add(win);
|
||||
}
|
||||
} else {
|
||||
mHidingNonSystemOverlayWindows.remove(win);
|
||||
}
|
||||
|
||||
final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty();
|
||||
|
||||
if (systemAlertWindowsHidden == hideSystemAlertWindows) {
|
||||
return;
|
||||
}
|
||||
|
||||
mRoot.forAllWindows((w) -> {
|
||||
w.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows);
|
||||
}, false /* traverseTopToBottom */);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ import static android.view.WindowManager.LayoutParams.FORMAT_CHANGED;
|
||||
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
|
||||
import static android.view.WindowManager.LayoutParams.MATCH_PARENT;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
|
||||
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_WILL_NOT_REPLACE_ON_RELAUNCH;
|
||||
@@ -59,7 +60,9 @@ import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_DRAWN_APPLICATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
|
||||
import static android.view.WindowManager.LayoutParams.isSystemAlertWindowType;
|
||||
import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_DOCKED;
|
||||
import static android.view.WindowManagerGlobal.RELAYOUT_RES_DRAG_RESIZING_FREEFORM;
|
||||
import static android.view.WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME;
|
||||
@@ -208,6 +211,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
boolean mPolicyVisibilityAfterAnim = true;
|
||||
private boolean mAppOpVisibility = true;
|
||||
boolean mPermanentlyHidden; // the window should never be shown again
|
||||
// This is a non-system overlay window that is currently force hidden.
|
||||
private boolean mForceHideNonSystemOverlayWindow;
|
||||
boolean mAppFreezing;
|
||||
boolean mHidden; // Used to determine if to show child windows.
|
||||
boolean mWallpaperVisible; // for wallpaper, what was last vis report?
|
||||
@@ -2371,6 +2376,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
// to handle their windows being removed from under them.
|
||||
return false;
|
||||
}
|
||||
if (mForceHideNonSystemOverlayWindow) {
|
||||
// This is an alert window that is currently force hidden.
|
||||
return false;
|
||||
}
|
||||
if (mPolicyVisibility && mPolicyVisibilityAfterAnim) {
|
||||
// Already showing.
|
||||
return false;
|
||||
@@ -2447,6 +2456,22 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
return true;
|
||||
}
|
||||
|
||||
void setForceHideNonSystemOverlayWindowIfNeeded(boolean forceHide) {
|
||||
if (mOwnerCanAddInternalSystemWindow
|
||||
|| (!isSystemAlertWindowType(mAttrs.type) && mAttrs.type != TYPE_TOAST)) {
|
||||
return;
|
||||
}
|
||||
if (mForceHideNonSystemOverlayWindow == forceHide) {
|
||||
return;
|
||||
}
|
||||
mForceHideNonSystemOverlayWindow = forceHide;
|
||||
if (forceHide) {
|
||||
hideLw(true /* doAnimation */, true /* requestAnim */);
|
||||
} else {
|
||||
showLw(true /* doAnimation */, true /* requestAnim */);
|
||||
}
|
||||
}
|
||||
|
||||
public void setAppOpVisibilityLw(boolean state) {
|
||||
if (mAppOpVisibility != state) {
|
||||
mAppOpVisibility = state;
|
||||
@@ -3330,7 +3355,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
pw.println(Integer.toHexString(mSystemUiVisibility));
|
||||
}
|
||||
if (!mPolicyVisibility || !mPolicyVisibilityAfterAnim || !mAppOpVisibility
|
||||
|| isParentWindowHidden()|| mPermanentlyHidden) {
|
||||
|| isParentWindowHidden()|| mPermanentlyHidden || mForceHideNonSystemOverlayWindow) {
|
||||
pw.print(prefix); pw.print("mPolicyVisibility=");
|
||||
pw.print(mPolicyVisibility);
|
||||
pw.print(" mPolicyVisibilityAfterAnim=");
|
||||
@@ -3338,8 +3363,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
pw.print(" mAppOpVisibility=");
|
||||
pw.print(mAppOpVisibility);
|
||||
pw.print(" parentHidden="); pw.print(isParentWindowHidden());
|
||||
pw.print(" mPermanentlyHidden="); pw.println(mPermanentlyHidden);
|
||||
}
|
||||
pw.print(" mForceHideNonSystemOverlayWindow="); pw.println(
|
||||
mForceHideNonSystemOverlayWindow); }
|
||||
if (!mRelayoutCalled || mLayoutNeeded) {
|
||||
pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled);
|
||||
pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded);
|
||||
@@ -3593,6 +3618,17 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
&& (mAttrs.privateFlags & PRIVATE_FLAG_LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if any window added by an application process that if of type
|
||||
* {@link android.view.WindowManager.LayoutParams#TYPE_TOAST} or that requires that requires
|
||||
* {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when
|
||||
* this window is visible.
|
||||
*/
|
||||
boolean hideNonSystemOverlayWindowsWhenVisible() {
|
||||
return (mAttrs.privateFlags & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0
|
||||
&& mSession.mCanHideNonSystemOverlayWindows;
|
||||
}
|
||||
|
||||
/** Returns the parent window if this is a child of another window, else null. */
|
||||
WindowState getParentWindow() {
|
||||
// NOTE: We are not calling getParent() directly as the WindowState might be a child of a
|
||||
|
||||
@@ -24,10 +24,8 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
|
||||
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
|
||||
import static android.view.Surface.SCALING_MODE_FREEZE;
|
||||
import static android.view.Surface.SCALING_MODE_SCALE_TO_WINDOW;
|
||||
|
||||
import android.graphics.PixelFormat;
|
||||
import android.graphics.Point;
|
||||
import android.graphics.PointF;
|
||||
import android.graphics.Rect;
|
||||
@@ -514,6 +512,8 @@ class WindowSurfaceController {
|
||||
void setShown(boolean surfaceShown) {
|
||||
mSurfaceShown = surfaceShown;
|
||||
|
||||
mService.updateNonSystemOverlayWindowsVisibilityIfNeeded(mAnimator.mWin, surfaceShown);
|
||||
|
||||
if (mWindowSession != null) {
|
||||
mWindowSession.onWindowSurfaceVisibilityChanged(this, mSurfaceShown, mWindowType);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user