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

Commit 9977f026 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Hide taskbar also when bottom sheet dialog is visible" into main

parents c836e535 d89cc535
Loading
Loading
Loading
Loading
+37 −1
Original line number Diff line number Diff line
@@ -23,19 +23,23 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.kosmos.runTest
import com.android.systemui.kosmos.testScope
import com.android.systemui.kosmos.useUnconfinedTestDispatcher
import com.android.systemui.model.sysUiState
import com.android.systemui.model.sysuiStateInteractor
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DIALOG_SHOWING
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.runner.RunWith
import org.mockito.Mockito.verify
import org.mockito.kotlin.eq

@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -46,6 +50,8 @@ class SystemUIBottomSheetDialogTest : SysuiTestCase() {
    private val configurationController = mock<ConfigurationController>()
    private val config = mock<Configuration>()
    private val delegate = mock<DialogDelegate<Dialog>>()
    private val dialogManager = kosmos.systemUIDialogManager
    private val defaultDisplaySysuiState = kosmos.sysUiState

    private lateinit var dialog: SystemUIBottomSheetDialog

@@ -60,6 +66,8 @@ class SystemUIBottomSheetDialogTest : SysuiTestCase() {
                    delegate,
                    TestLayout(),
                    0,
                    dialogManager,
                    sysuiStateInteractor,
                )
            }
    }
@@ -82,6 +90,34 @@ class SystemUIBottomSheetDialogTest : SysuiTestCase() {
        }
    }

    @Test
    fun onStop_unregistersThenUnregistersWithDialogManager() {
        kosmos.runTest {
            dialog.show()

            verify(dialogManager).setShowing(eq(dialog), eq(true))

            dialog.dismiss()

            verify(dialogManager).setShowing(eq(dialog), eq(false))
        }
    }

    @Test
    fun onStart_setsSysUIFlagsCorrectly() {
        kosmos.runTest {
            assertThat(defaultDisplaySysuiState.isFlagEnabled(SYSUI_STATE_DIALOG_SHOWING)).isFalse()

            dialog.show()

            assertThat(defaultDisplaySysuiState.isFlagEnabled(SYSUI_STATE_DIALOG_SHOWING)).isTrue()

            dialog.dismiss()

            assertThat(defaultDisplaySysuiState.isFlagEnabled(SYSUI_STATE_DIALOG_SHOWING)).isFalse()
        }
    }

    @Test
    fun onConfigurationChanged_calledInDelegate() {
        kosmos.runTest {
+21 −1
Original line number Diff line number Diff line
@@ -29,8 +29,12 @@ import android.view.WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS
import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL
import androidx.activity.ComponentDialog
import androidx.annotation.VisibleForTesting
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.common.domain.interactor.SysUIStateDisplaysInteractor
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.model.StateChange
import com.android.systemui.res.R
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.onConfigChanged
import dagger.Lazy
@@ -42,7 +46,6 @@ import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import com.android.app.tracing.coroutines.launchTraced as launch

/** A dialog shown as a bottom sheet. */
class SystemUIBottomSheetDialog
@@ -54,6 +57,8 @@ constructor(
    private val delegate: DialogDelegate<in Dialog>,
    private val windowLayout: WindowLayout,
    theme: Int,
    private val dialogManager: SystemUIDialogManager,
    private val sysUIStateDisplaysInteractor: SysUIStateDisplaysInteractor,
) : ComponentDialog(context, theme) {

    private var job: Job? = null
@@ -95,14 +100,25 @@ constructor(
                    .launchIn(this)
            }
        delegate.onStart(this)
        dialogManager.setShowing(this, /* showing= */ true)
        setDialogShowingFlag(true)
    }

    override fun onStop() {
        job?.cancel()
        delegate.onStop(this)
        dialogManager.setShowing(this, /* showing= */ false)
        setDialogShowingFlag(false)
        super.onStop()
    }

    private fun setDialogShowingFlag(showing: Boolean) {
        sysUIStateDisplaysInteractor.setFlags(
            context.displayId,
            StateChange().setFlag(QuickStepContract.SYSUI_STATE_DIALOG_SHOWING, showing),
        )
    }

    override fun onWindowFocusChanged(hasFocus: Boolean) {
        super.onWindowFocusChanged(hasFocus)
        delegate.onWindowFocusChanged(this, hasFocus)
@@ -115,6 +131,8 @@ constructor(
        @Application private val coroutineScope: CoroutineScope,
        private val defaultWindowLayout: Lazy<WindowLayout.LimitedEdgeToEdge>,
        private val configurationController: ConfigurationController,
        private val dialogManager: SystemUIDialogManager,
        private val sysUIStateDisplaysInteractor: SysUIStateDisplaysInteractor,
    ) {

        fun create(
@@ -129,6 +147,8 @@ constructor(
                delegate = delegate,
                windowLayout = windowLayout,
                theme = theme,
                dialogManager = dialogManager,
                sysUIStateDisplaysInteractor = sysUIStateDisplaysInteractor,
            )
    }

+15 −8
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.phone;

import android.app.Dialog;

import androidx.annotation.NonNull;

@@ -41,12 +42,11 @@ import javax.inject.Inject;
public class SystemUIDialogManager implements Dumpable {
    private final KeyguardViewController mKeyguardViewController;

    private final Set<SystemUIDialog> mDialogsShowing = new HashSet<>();
    private final Set<Dialog> mDialogsShowing = new HashSet<>();
    private final Set<Listener> mListeners = new HashSet<>();

    @Inject
    public SystemUIDialogManager(
            DumpManager dumpManager,
    public SystemUIDialogManager(DumpManager dumpManager,
            KeyguardViewController keyguardViewController) {
        dumpManager.registerDumpable(this);
        mKeyguardViewController = keyguardViewController;
@@ -61,9 +61,16 @@ public class SystemUIDialogManager implements Dumpable {

    /** Dismisses all dialogs on a specific display. */
    public void dismissDialogsForDisplayId(int displayId) {
        mDialogsShowing.stream().filter(
                dialog -> dialog.getContext().getDisplayId() == displayId).forEach(
                SystemUIDialog::dismissWithoutAnimation);
        mDialogsShowing
                .stream()
                .filter(dialog -> dialog.getContext().getDisplayId() == displayId)
                .forEach(dialog -> {
                    if (dialog instanceof SystemUIDialog systemUIDialog) {
                        systemUIDialog.dismissWithoutAnimation();
                    } else {
                        dialog.dismiss();
                    }
                });
    }

    /**
@@ -80,7 +87,7 @@ public class SystemUIDialogManager implements Dumpable {
        mListeners.remove(listener);
    }

    void setShowing(SystemUIDialog dialog, boolean showing) {
    void setShowing(Dialog dialog, boolean showing) {
        final boolean wasHidingAffordances = shouldHideAffordance();
        if (showing) {
            mDialogsShowing.add(dialog);
@@ -110,7 +117,7 @@ public class SystemUIDialogManager implements Dumpable {
            pw.println("\t" + listener);
        }
        pw.println("dialogs tracked:");
        for (SystemUIDialog dialog : mDialogsShowing) {
        for (Dialog dialog : mDialogsShowing) {
            pw.println("\t" + dialog);
        }
    }