diff options
9 files changed, 136 insertions, 13 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index f978b579a10e..bab0306aaf9f 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -112,6 +112,13 @@ oneway interface IStatusBar */ void showGlobalActionsMenu(); + /** + * Set whether the top app currently hides the statusbar. + * + * @param hidesStatusBar whether it is being hidden + */ + void setTopAppHidesStatusBar(boolean hidesStatusBar); + void addQsTile(in ComponentName tile); void remQsTile(in ComponentName tile); void clickQsTile(in ComponentName tile); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index bbf9eb1499c0..634927503747 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -81,6 +81,7 @@ public class CommandQueue extends IStatusBar.Stub { private static final int MSG_SHOW_GLOBAL_ACTIONS = 34 << MSG_SHIFT; private static final int MSG_TOGGLE_PANEL = 35 << MSG_SHIFT; private static final int MSG_SHOW_SHUTDOWN_UI = 36 << MSG_SHIFT; + private static final int MSG_SET_TOP_APP_HIDES_STATUS_BAR = 37 << MSG_SHIFT; public static final int FLAG_EXCLUDE_NONE = 0; public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -132,6 +133,7 @@ public class CommandQueue extends IStatusBar.Stub { default void startAssist(Bundle args) { } default void onCameraLaunchGestureDetected(int source) { } default void showPictureInPictureMenu() { } + default void setTopAppHidesStatusBar(boolean topAppHidesStatusBar) { } default void addQsTile(ComponentName tile) { } default void remQsTile(ComponentName tile) { } @@ -441,6 +443,13 @@ public class CommandQueue extends IStatusBar.Stub { } @Override + public void setTopAppHidesStatusBar(boolean hidesStatusBar) { + mHandler.removeMessages(MSG_SET_TOP_APP_HIDES_STATUS_BAR); + mHandler.obtainMessage(MSG_SET_TOP_APP_HIDES_STATUS_BAR, hidesStatusBar ? 1 : 0, 0) + .sendToTarget(); + } + + @Override public void showShutdownUi(boolean isReboot, String reason) { synchronized (mLock) { mHandler.removeMessages(MSG_SHOW_SHUTDOWN_UI); @@ -640,6 +649,11 @@ public class CommandQueue extends IStatusBar.Stub { mCallbacks.get(i).handleShowShutdownUi(msg.arg1 != 0, (String) msg.obj); } break; + case MSG_SET_TOP_APP_HIDES_STATUS_BAR: + for (int i = 0; i < mCallbacks.size(); i++) { + mCallbacks.get(i).setTopAppHidesStatusBar(msg.arg1 != 0); + } + break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java index 4339ade13ce0..5c040588b266 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java @@ -179,7 +179,13 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } private boolean shouldHideNotificationIcons() { - return !mStatusBar.isClosed() && mStatusBarComponent.hideStatusBarIconsWhenExpanded(); + if (!mStatusBar.isClosed() && mStatusBarComponent.hideStatusBarIconsWhenExpanded()) { + return true; + } + if (mStatusBarComponent.hideStatusBarIconsForBouncer()) { + return true; + } + return false; } public void hideSystemIconArea(boolean animate) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index b2c97b126a26..a96cd790d444 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -104,7 +104,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; import android.provider.Settings; -import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; import android.service.vr.IVrManager; @@ -143,7 +142,6 @@ import android.widget.Toast; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.colorextraction.ColorExtractor; -import com.android.internal.graphics.ColorUtils; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; @@ -639,6 +637,12 @@ public class StatusBar extends SystemUI implements DemoMode, // Fingerprint (as computed by getLoggingFingerprint() of the last logged state. private int mLastLoggedStateFingerprint; + private boolean mTopHidesStatusBar; + private boolean mStatusBarWindowHidden; + private boolean mHideIconsForBouncer; + private boolean mIsOccluded; + private boolean mWereIconsJustHidden; + private boolean mBouncerWasShowingWhenHidden; public boolean isStartedGoingToSleep() { return mStartedGoingToSleep; @@ -2825,6 +2829,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void setPanelExpanded(boolean isExpanded) { mPanelExpanded = isExpanded; + updateHideIconsForBouncer(false /* animate */); mStatusBarWindowManager.setPanelExpanded(isExpanded); mVisualStabilityManager.setPanelExpanded(isExpanded); if (isExpanded && getBarState() != StatusBarState.KEYGUARD) { @@ -2890,6 +2895,40 @@ public class StatusBar extends SystemUI implements DemoMode, return mAmbientIndicationContainer; } + public void setOccluded(boolean occluded) { + mIsOccluded = occluded; + updateHideIconsForBouncer(false /* animate */); + } + + public boolean hideStatusBarIconsForBouncer() { + return mHideIconsForBouncer || mWereIconsJustHidden; + } + + /** + * @param animate should the change of the icons be animated. + */ + private void updateHideIconsForBouncer(boolean animate) { + boolean shouldHideIconsForBouncer = !mPanelExpanded && mTopHidesStatusBar && mIsOccluded + && (mBouncerShowing || mStatusBarWindowHidden); + if (mHideIconsForBouncer != shouldHideIconsForBouncer) { + mHideIconsForBouncer = shouldHideIconsForBouncer; + if (!shouldHideIconsForBouncer && mBouncerWasShowingWhenHidden) { + // We're delaying the showing, since most of the time the fullscreen app will + // hide the icons again and we don't want them to fade in and out immediately again. + mWereIconsJustHidden = true; + mHandler.postDelayed(() -> { + mWereIconsJustHidden = false; + recomputeDisableFlags(true); + }, 500); + } else { + recomputeDisableFlags(animate); + } + } + if (shouldHideIconsForBouncer) { + mBouncerWasShowingWhenHidden = mBouncerShowing; + } + } + /** * All changes to the status bar and notifications funnel through here and are batched. */ @@ -3216,6 +3255,10 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarView.collapsePanel(false /* animate */, false /* delayed */, 1.0f /* speedUpFactor */); } + if (mStatusBarView != null) { + mStatusBarWindowHidden = state == WINDOW_STATE_HIDDEN; + updateHideIconsForBouncer(false /* animate */); + } } } @@ -5162,6 +5205,7 @@ public class StatusBar extends SystemUI implements DemoMode, public void setBouncerShowing(boolean bouncerShowing) { mBouncerShowing = bouncerShowing; if (mStatusBarView != null) mStatusBarView.setBouncerShowing(bouncerShowing); + updateHideIconsForBouncer(true /* animate */); recomputeDisableFlags(true /* animate */); } @@ -6568,6 +6612,18 @@ public class StatusBar extends SystemUI implements DemoMode, mHandler.obtainMessage(msg, deviceId, 0).sendToTarget(); } + @Override + public void setTopAppHidesStatusBar(boolean topAppHidesStatusBar) { + mTopHidesStatusBar = topAppHidesStatusBar; + if (!topAppHidesStatusBar && mWereIconsJustHidden) { + // Immediately update the icon hidden state, since that should only apply if we're + // staying fullscreen. + mWereIconsJustHidden = false; + recomputeDisableFlags(true); + } + updateHideIconsForBouncer(true /* animate */); + } + protected void sendCloseSystemWindows(String reason) { try { ActivityManager.getService().closeSystemDialogs(reason); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index b4b859c2409c..bbce751dcdfd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -302,6 +302,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } public void setOccluded(boolean occluded, boolean animate) { + mStatusBar.setOccluded(occluded); if (occluded && !mOccluded && mShowing) { if (mStatusBar.isInLaunchTransition()) { mOccluded = true; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index f67ebe4d7634..4c2e4692a34f 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5552,6 +5552,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowManager.LayoutParams statusBarAttrs = mStatusBar.getAttrs(); boolean statusBarExpanded = statusBarAttrs.height == MATCH_PARENT && statusBarAttrs.width == MATCH_PARENT; + boolean topAppHidesStatusBar = topAppHidesStatusBar(); if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent || statusBarExpanded) { if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced"); @@ -5572,16 +5573,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } else if (mTopFullscreenOpaqueWindowState != null) { - final int fl = PolicyControl.getWindowFlags(null, lp); - if (localLOGV) { - Slog.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw() - + " shown position: " - + mTopFullscreenOpaqueWindowState.getShownPositionLw()); - Slog.d(TAG, "attr: " + mTopFullscreenOpaqueWindowState.getAttrs() - + " lp.flags=0x" + Integer.toHexString(fl)); - } - topIsFullscreen = (fl & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0 - || (mLastSystemUiFlags & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + topIsFullscreen = topAppHidesStatusBar; // The subtle difference between the window for mTopFullscreenOpaqueWindowState // and mTopIsFullscreen is that mTopIsFullscreen is set only if the window // has the FLAG_FULLSCREEN set. Not sure if there is another way that to be the @@ -5604,8 +5596,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mStatusBarController.setBarShowingLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; } + topAppHidesStatusBar = false; } } + mStatusBarController.setTopAppHidesStatusBar(topAppHidesStatusBar); } if (mTopIsFullscreen != topIsFullscreen) { @@ -5646,6 +5640,27 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** + * @return Whether the top app should hide the statusbar based on the top fullscreen opaque + * window. + */ + private boolean topAppHidesStatusBar() { + if (mTopFullscreenOpaqueWindowState == null) { + return false; + } + final int fl = PolicyControl.getWindowFlags(null, + mTopFullscreenOpaqueWindowState.getAttrs()); + if (localLOGV) { + Slog.d(TAG, "frame: " + mTopFullscreenOpaqueWindowState.getFrameLw() + + " shown position: " + + mTopFullscreenOpaqueWindowState.getShownPositionLw()); + Slog.d(TAG, "attr: " + mTopFullscreenOpaqueWindowState.getAttrs() + + " lp.flags=0x" + Integer.toHexString(fl)); + } + return (fl & LayoutParams.FLAG_FULLSCREEN) != 0 + || (mLastSystemUiFlags & View.SYSTEM_UI_FLAG_FULLSCREEN) != 0; + } + + /** * Updates the occluded state of the Keyguard. * * @return Whether the flags have changed and we have to redo the layout. diff --git a/services/core/java/com/android/server/policy/StatusBarController.java b/services/core/java/com/android/server/policy/StatusBarController.java index 7d67b60a9e9f..ecc88b50a37c 100644 --- a/services/core/java/com/android/server/policy/StatusBarController.java +++ b/services/core/java/com/android/server/policy/StatusBarController.java @@ -112,6 +112,14 @@ public class StatusBarController extends BarController { View.STATUS_BAR_TRANSPARENT); } + + public void setTopAppHidesStatusBar(boolean hidesStatusBar) { + StatusBarManagerInternal statusbar = getStatusBarInternal(); + if (statusbar != null) { + statusbar.setTopAppHidesStatusBar(hidesStatusBar); + } + } + @Override protected boolean skipAnimation() { return mWin.getAttrs().height == MATCH_PARENT; diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 866fdadc54d7..0884678478f6 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -80,6 +80,13 @@ public interface StatusBarManagerInternal { void setGlobalActionsListener(GlobalActionsListener listener); void showGlobalActions(); + /** + * Set whether the top app currently hides the statusbar. + * + * @param hidesStatusBar whether it is being hidden + */ + void setTopAppHidesStatusBar(boolean hidesStatusBar); + boolean showShutdownUi(boolean isReboot, String requestString); public interface GlobalActionsListener { diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index d31c2304f460..34ac645c4cf2 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -332,6 +332,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub { } @Override + public void setTopAppHidesStatusBar(boolean hidesStatusBar) { + if (mBar != null) { + try { + mBar.setTopAppHidesStatusBar(hidesStatusBar); + } catch (RemoteException ex) {} + } + } + + @Override public boolean showShutdownUi(boolean isReboot, String reason) { if (!mContext.getResources().getBoolean(R.bool.config_showSysuiShutdown)) { return false; |