Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54e9796c authored by Will's avatar Will
Browse files

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
parent a9449268
Loading
Loading
Loading
Loading
+31 −1
Original line number Diff line number Diff line
@@ -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;
            }
        });
    }
}
+48 −1
Original line number Diff line number Diff line
@@ -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());
    }
}