From ab216609f1608e61827d955fcc9fd0560bc52e4d Mon Sep 17 00:00:00 2001 From: Winson Date: Tue, 9 Aug 2016 14:05:20 -0700 Subject: [PATCH] Removing private system ui flags from status bar flags logic. - Prevent third party apps from inadvertently changing internal SystemUI flags through a call to setSystemUiVisibility(). These flags are only set in the individual SystemUI components and can be updated in WMS directly. Bug: 29875297 Change-Id: I5ea238c8fb16a0eccd6e993d95a912acb359cee6 --- core/java/android/view/IWindowManager.aidl | 10 +++++ core/java/android/view/View.java | 14 ------ .../android/view/WindowManagerPolicy.java | 10 +++++ .../android/systemui/recents/RecentsImpl.java | 6 +-- .../recents/misc/SystemServicesProxy.java | 25 +++++++++++ .../systemui/recents/tv/RecentsTvImpl.java | 6 +-- .../statusbar/phone/PhoneStatusBar.java | 19 -------- .../systemui/statusbar/tv/TvStatusBar.java | 45 ------------------- .../android/systemui/tv/pip/PipManager.java | 7 +-- .../server/policy/PhoneWindowManager.java | 12 ++++- .../server/wm/WindowManagerService.java | 26 +++++++++++ .../src/android/view/IWindowManagerImpl.java | 10 +++++ 12 files changed, 95 insertions(+), 95 deletions(-) diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 83feb88fa55d2..855b1bce11584 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -330,6 +330,16 @@ interface IWindowManager */ oneway void statusBarVisibilityChanged(int visibility); + /** + * Called by System UI to notify of changes to the visibility of Recents. + */ + oneway void setRecentsVisibility(boolean visible); + + /** + * Called by System UI to notify of changes to the visibility of PIP. + */ + oneway void setTvPipVisibility(boolean visible); + /** * Device has a software navigation bar (separate from the status bar). */ diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index a0afeba27fc5d..f9180bff65d0a 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3083,20 +3083,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ public static final int NAVIGATION_BAR_TRANSLUCENT = 0x80000000; - /** - * @hide - * - * Whether Recents is visible or not. - */ - public static final int RECENT_APPS_VISIBLE = 0x00004000; - - /** - * @hide - * - * Whether the TV's picture-in-picture is visible or not. - */ - public static final int TV_PICTURE_IN_PICTURE_VISIBLE = 0x00010000; - /** * @hide * diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 2b3d6436dd4ee..46a0194b1b09e 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1305,6 +1305,16 @@ public interface WindowManagerPolicy { */ public int adjustSystemUiVisibilityLw(int visibility); + /** + * Called by System UI to notify of changes to the visibility of Recents. + */ + public void setRecentsVisibilityLw(boolean visible); + + /** + * Called by System UI to notify of changes to the visibility of PIP. + */ + public void setTvPipVisibilityLw(boolean visible); + /** * Specifies whether there is an on-screen navigation bar separate from the status bar. */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index a7f271648e137..ab4c811f6a060 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -216,11 +216,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener * {@link Recents#onBusEvent(RecentsVisibilityChangedEvent)}. */ public void onVisibilityChanged(Context context, boolean visible) { - SystemUIApplication app = (SystemUIApplication) context; - PhoneStatusBar statusBar = app.getComponent(PhoneStatusBar.class); - if (statusBar != null) { - statusBar.updateRecentsVisibility(visible); - } + Recents.getSystemServices().setRecentsVisibility(visible); } /** diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index b896f8a4d815c..930ed795af9fc 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -69,6 +69,7 @@ import android.util.MutableBoolean; import android.view.Display; import android.view.IAppTransitionAnimationSpecsFuture; import android.view.IDockedStackListener; +import android.view.IWindowManager; import android.view.WindowManager; import android.view.WindowManager.KeyboardShortcutsReceiver; import android.view.WindowManagerGlobal; @@ -120,6 +121,7 @@ public class SystemServicesProxy { IPackageManager mIpm; AssistUtils mAssistUtils; WindowManager mWm; + IWindowManager mIwm; UserManager mUm; Display mDisplay; String mRecentsPackage; @@ -207,6 +209,7 @@ public class SystemServicesProxy { mIpm = AppGlobals.getPackageManager(); mAssistUtils = new AssistUtils(context); mWm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + mIwm = WindowManagerGlobal.getWindowManagerService(); mUm = UserManager.get(context); mDisplay = mWm.getDefaultDisplay(); mRecentsPackage = context.getPackageName(); @@ -1091,6 +1094,28 @@ public class SystemServicesProxy { } } + /** + * Updates the visibility of recents. + */ + public void setRecentsVisibility(boolean visible) { + try { + mIwm.setRecentsVisibility(visible); + } catch (RemoteException e) { + Log.e(TAG, "Unable to reach window manager", e); + } + } + + /** + * Updates the visibility of the picture-in-picture. + */ + public void setTvPipVisibility(boolean visible) { + try { + mIwm.setTvPipVisibility(visible); + } catch (RemoteException e) { + Log.e(TAG, "Unable to reach window manager", e); + } + } + private final class H extends Handler { private static final int ON_TASK_STACK_CHANGED = 1; private static final int ON_ACTIVITY_PINNED = 2; diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java index fca8d2d1fae1c..ef9de53682e40 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvImpl.java @@ -140,10 +140,6 @@ public class RecentsTvImpl extends RecentsImpl{ @Override public void onVisibilityChanged(Context context, boolean visible) { - SystemUIApplication app = (SystemUIApplication) context; - TvStatusBar statusBar = app.getComponent(TvStatusBar.class); - if (statusBar != null) { - statusBar.updateRecentsVisibility(visible); - } + Recents.getSystemServices().setRecentsVisibility(visible); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 9251f32099a7c..714c88df182ea 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -2994,10 +2994,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, Integer.toHexString(diff))); boolean sbModeChanged = false; if (diff != 0) { - // we never set the recents bit via this method, so save the prior state to prevent - // clobbering the bit below - final boolean wasRecentsVisible = (mSystemUiVisibility & View.RECENT_APPS_VISIBLE) > 0; - mSystemUiVisibility = newVal; // update low profile @@ -3048,11 +3044,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mSystemUiVisibility &= ~View.NAVIGATION_BAR_UNHIDE; } - // restore the recents bit - if (wasRecentsVisible) { - mSystemUiVisibility |= View.RECENT_APPS_VISIBLE; - } - // send updated sysui visibility to window manager notifyUiVisibilityChanged(mSystemUiVisibility); } @@ -4816,16 +4807,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return false; } - public void updateRecentsVisibility(boolean visible) { - // Update the recents visibility flag - if (visible) { - mSystemUiVisibility |= View.RECENT_APPS_VISIBLE; - } else { - mSystemUiVisibility &= ~View.RECENT_APPS_VISIBLE; - } - notifyUiVisibilityChanged(mSystemUiVisibility); - } - @Override public void showScreenPinningRequest(int taskId) { if (mKeyguardMonitor.isShowing()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java index 2d4900b368905..3c83921a1e140 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar.tv; import android.content.ComponentName; import android.graphics.Rect; import android.os.IBinder; -import android.os.RemoteException; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; import android.view.View; @@ -36,16 +35,6 @@ import com.android.systemui.tv.pip.PipManager; public class TvStatusBar extends BaseStatusBar { - /** - * Tracking calls to View.setSystemUiVisibility(). - */ - int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE; - - /** - * Last value sent to window manager. - */ - private int mLastDispatchedSystemUiVisibility = ~View.SYSTEM_UI_FLAG_VISIBLE; - @Override public void setIcon(String slot, StatusBarIcon icon) { } @@ -224,40 +213,6 @@ public class TvStatusBar extends BaseStatusBar { putComponent(TvStatusBar.class, this); } - /** - * Updates the visibility of the picture-in-picture. - */ - public void updatePipVisibility(boolean visible) { - if (visible) { - mSystemUiVisibility |= View.TV_PICTURE_IN_PICTURE_VISIBLE; - } else { - mSystemUiVisibility &= ~View.TV_PICTURE_IN_PICTURE_VISIBLE; - } - notifyUiVisibilityChanged(mSystemUiVisibility); - } - - /** - * Updates the visibility of the Recents - */ - public void updateRecentsVisibility(boolean visible) { - if (visible) { - mSystemUiVisibility |= View.RECENT_APPS_VISIBLE; - } else { - mSystemUiVisibility &= ~View.RECENT_APPS_VISIBLE; - } - notifyUiVisibilityChanged(mSystemUiVisibility); - } - - private void notifyUiVisibilityChanged(int vis) { - try { - if (mLastDispatchedSystemUiVisibility != vis) { - mWindowManagerService.statusBarVisibilityChanged(vis); - mLastDispatchedSystemUiVisibility = vis; - } - } catch (RemoteException ex) { - } - } - @Override public void handleSystemNavigationKey(int arg1) { // Not implemented diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java index 3f8650a5e1169..085e003f8869d 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java @@ -723,10 +723,7 @@ public class PipManager { return mPipRecentsOverlayManager; } - private void updatePipVisibility(boolean visible) { - TvStatusBar statusBar = ((SystemUIApplication) mContext).getComponent(TvStatusBar.class); - if (statusBar != null) { - statusBar.updatePipVisibility(visible); - } + private void updatePipVisibility(final boolean visible) { + SystemServicesProxy.getInstance(mContext).setTvPipVisibility(visible); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index ccf9b898d7b26..8a52caacdb3ad 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3851,12 +3851,20 @@ public class PhoneWindowManager implements WindowManagerPolicy { } }; + @Override + public void setRecentsVisibilityLw(boolean visible) { + mRecentsVisible = visible; + } + + @Override + public void setTvPipVisibilityLw(boolean visible) { + mTvPictureInPictureVisible = visible; + } + @Override public int adjustSystemUiVisibilityLw(int visibility) { mStatusBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility); mNavigationBarController.adjustSystemUiVisibilityLw(mLastSystemUiFlags, visibility); - mRecentsVisible = (visibility & View.RECENT_APPS_VISIBLE) > 0; - mTvPictureInPictureVisible = (visibility & View.TV_PICTURE_IN_PICTURE_VISIBLE) > 0; // Reset any bits in mForceClearingStatusBarVisibility that // are now clear. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 707b13780c460..1b2322bd19038 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -10226,6 +10226,32 @@ public class WindowManagerService extends IWindowManager.Stub } } + @Override + public void setRecentsVisibility(boolean visible) { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Caller does not hold permission " + + android.Manifest.permission.STATUS_BAR); + } + + synchronized (mWindowMap) { + mPolicy.setRecentsVisibilityLw(visible); + } + } + + @Override + public void setTvPipVisibility(boolean visible) { + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Caller does not hold permission " + + android.Manifest.permission.STATUS_BAR); + } + + synchronized (mWindowMap) { + mPolicy.setTvPipVisibilityLw(visible); + } + } + @Override public void statusBarVisibilityChanged(int visibility) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR) diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java index 76522f95fbd44..0c3231bcde600 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -459,6 +459,16 @@ public class IWindowManagerImpl implements IWindowManager { // TODO Auto-generated method stub } + @Override + public void setRecentsVisibility(boolean visible) { + // TODO Auto-generated method stub + } + + @Override + public void setTvPipVisibility(boolean visible) { + // TODO Auto-generated method stub + } + @Override public void stopAppFreezingScreen(IBinder arg0, boolean arg1) throws RemoteException { // TODO Auto-generated method stub