Hide dream status bar when system status bar showing.

This avoids showing double status bars when the system status bar
appears in certain situations.

Test: atest DreamOverlayStatusBarControllerTest
Bug: 223641960, 224775246
Change-Id: Id7e23fe8d763f931c39bd5c2866a310fdaf785fa
This commit is contained in:
Will
2022-04-15 15:51:20 -07:00
parent a944926829
commit 54e9796cde
2 changed files with 79 additions and 2 deletions

View File

@@ -16,8 +16,13 @@
package com.android.systemui.dreams;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_HIDING;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import android.annotation.Nullable;
import android.app.AlarmManager;
import android.app.StatusBarManager;
import android.content.res.Resources;
import android.hardware.SensorPrivacyManager;
import android.net.ConnectivityManager;
@@ -29,6 +34,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.text.format.DateFormat;
import android.util.PluralsMessageFormatter;
import android.view.View;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Main;
@@ -36,6 +42,7 @@ import com.android.systemui.dreams.dagger.DreamOverlayComponent;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.time.DateFormatUtil;
@@ -119,7 +126,8 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
DateFormatUtil dateFormatUtil,
IndividualSensorPrivacyController sensorPrivacyController,
DreamOverlayNotificationCountProvider dreamOverlayNotificationCountProvider,
ZenModeController zenModeController) {
ZenModeController zenModeController,
StatusBarWindowStateController statusBarWindowStateController) {
super(view);
mResources = resources;
mMainExecutor = mainExecutor;
@@ -131,6 +139,10 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
mSensorPrivacyController = sensorPrivacyController;
mDreamOverlayNotificationCountProvider = dreamOverlayNotificationCountProvider;
mZenModeController = zenModeController;
// Register to receive show/hide updates for the system status bar. Our custom status bar
// needs to hide when the system status bar is showing to ovoid overlapping status bars.
statusBarWindowStateController.addListener(this::onSystemStatusBarStateChanged);
}
@Override
@@ -229,4 +241,22 @@ public class DreamOverlayStatusBarViewController extends ViewController<DreamOve
}
});
}
private void onSystemStatusBarStateChanged(@StatusBarManager.WindowVisibleState int state) {
mMainExecutor.execute(() -> {
if (!mIsAttached) {
return;
}
switch (state) {
case WINDOW_STATE_SHOWING:
mView.setVisibility(View.INVISIBLE);
break;
case WINDOW_STATE_HIDING:
case WINDOW_STATE_HIDDEN:
mView.setVisibility(View.VISIBLE);
break;
}
});
}
}

View File

@@ -16,10 +16,14 @@
package com.android.systemui.dreams;
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -32,6 +36,7 @@ import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.view.View;
import androidx.test.filters.SmallTest;
@@ -40,6 +45,8 @@ import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.statusbar.window.StatusBarWindowStateListener;
import com.android.systemui.touch.TouchInsetManager;
import com.android.systemui.util.time.DateFormatUtil;
@@ -84,6 +91,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
ZenModeController mZenModeController;
@Mock
DreamOverlayNotificationCountProvider mDreamOverlayNotificationCountProvider;
@Mock
StatusBarWindowStateController mStatusBarWindowStateController;
private final Executor mMainExecutor = Runnable::run;
@@ -107,7 +116,8 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
mDateFormatUtil,
mSensorPrivacyController,
mDreamOverlayNotificationCountProvider,
mZenModeController);
mZenModeController,
mStatusBarWindowStateController);
}
@Test
@@ -401,4 +411,41 @@ public class DreamOverlayStatusBarViewControllerTest extends SysuiTestCase {
verify(mView).showIcon(
DreamOverlayStatusBarView.STATUS_ICON_PRIORITY_MODE_ON, false, null);
}
@Test
public void testStatusBarHiddenWhenSystemStatusBarShown() {
mController.onViewAttached();
final ArgumentCaptor<StatusBarWindowStateListener>
callbackCapture = ArgumentCaptor.forClass(StatusBarWindowStateListener.class);
verify(mStatusBarWindowStateController).addListener(callbackCapture.capture());
callbackCapture.getValue().onStatusBarWindowStateChanged(WINDOW_STATE_SHOWING);
verify(mView).setVisibility(View.INVISIBLE);
}
@Test
public void testStatusBarShownWhenSystemStatusBarHidden() {
mController.onViewAttached();
final ArgumentCaptor<StatusBarWindowStateListener>
callbackCapture = ArgumentCaptor.forClass(StatusBarWindowStateListener.class);
verify(mStatusBarWindowStateController).addListener(callbackCapture.capture());
callbackCapture.getValue().onStatusBarWindowStateChanged(WINDOW_STATE_HIDDEN);
verify(mView).setVisibility(View.VISIBLE);
}
@Test
public void testUnattachedStatusBarVisibilityUnchangedWhenSystemStatusBarHidden() {
mController.onViewAttached();
mController.onViewDetached();
final ArgumentCaptor<StatusBarWindowStateListener>
callbackCapture = ArgumentCaptor.forClass(StatusBarWindowStateListener.class);
verify(mStatusBarWindowStateController).addListener(callbackCapture.capture());
callbackCapture.getValue().onStatusBarWindowStateChanged(WINDOW_STATE_SHOWING);
verify(mView, never()).setVisibility(anyInt());
}
}