Fixed that the status icons were showing in the camera
When launching to quicksettings, the camera icons showed
above the camera, clashing with their UI
Test: launch camera (locked) and click on galery
Fixes: 64317909
Change-Id: I4ef68963af11f6d0be739c79cdf352ba35d9ece0
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index f978b57..bab0306aa 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -112,6 +112,13 @@
*/
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 bbf9eb1..6349275 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 @@
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 @@
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 @@
}
@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 @@
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 4339ade..5c04058 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 @@
}
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 59e7005..30b36c2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -105,7 +105,6 @@
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;
@@ -144,7 +143,6 @@
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;
@@ -641,6 +639,12 @@
// 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;
@@ -2828,6 +2832,7 @@
public void setPanelExpanded(boolean isExpanded) {
mPanelExpanded = isExpanded;
+ updateHideIconsForBouncer(false /* animate */);
mStatusBarWindowManager.setPanelExpanded(isExpanded);
mVisualStabilityManager.setPanelExpanded(isExpanded);
if (isExpanded && getBarState() != StatusBarState.KEYGUARD) {
@@ -2893,6 +2898,40 @@
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.
*/
@@ -3219,6 +3258,10 @@
mStatusBarView.collapsePanel(false /* animate */, false /* delayed */,
1.0f /* speedUpFactor */);
}
+ if (mStatusBarView != null) {
+ mStatusBarWindowHidden = state == WINDOW_STATE_HIDDEN;
+ updateHideIconsForBouncer(false /* animate */);
+ }
}
}
@@ -5152,6 +5195,7 @@
public void setBouncerShowing(boolean bouncerShowing) {
mBouncerShowing = bouncerShowing;
if (mStatusBarView != null) mStatusBarView.setBouncerShowing(bouncerShowing);
+ updateHideIconsForBouncer(true /* animate */);
recomputeDisableFlags(true /* animate */);
}
@@ -6549,6 +6593,18 @@
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 b4b859c..bbce751 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 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 ae78d7c..e0c0599 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -5517,6 +5517,7 @@
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");
@@ -5537,16 +5538,7 @@
}
}
} 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
@@ -5569,8 +5561,10 @@
if (mStatusBarController.setBarShowingLw(true)) {
changes |= FINISH_LAYOUT_REDO_LAYOUT;
}
+ topAppHidesStatusBar = false;
}
}
+ mStatusBarController.setTopAppHidesStatusBar(topAppHidesStatusBar);
}
if (mTopIsFullscreen != topIsFullscreen) {
@@ -5598,6 +5592,27 @@
}
/**
+ * @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 7d67b60..ecc88b5 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 @@
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 866fdad..0884678 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 @@
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 d31c230..34ac645 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 @@
}
@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;