Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialogTest.kt +37 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 Loading @@ -60,6 +66,8 @@ class SystemUIBottomSheetDialogTest : SysuiTestCase() { delegate, TestLayout(), 0, dialogManager, sysuiStateInteractor, ) } } Loading @@ -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 { Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialog.kt +21 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) Loading @@ -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( Loading @@ -129,6 +147,8 @@ constructor( delegate = delegate, windowLayout = windowLayout, theme = theme, dialogManager = dialogManager, sysUIStateDisplaysInteractor = sysUIStateDisplaysInteractor, ) } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialogManager.java +15 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; import android.app.Dialog; import androidx.annotation.NonNull; Loading @@ -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; Loading @@ -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(); } }); } /** Loading @@ -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); Loading Loading @@ -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); } } Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialogTest.kt +37 −1 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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 Loading @@ -60,6 +66,8 @@ class SystemUIBottomSheetDialogTest : SysuiTestCase() { delegate, TestLayout(), 0, dialogManager, sysuiStateInteractor, ) } } Loading @@ -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 { Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialog.kt +21 −1 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) Loading @@ -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( Loading @@ -129,6 +147,8 @@ constructor( delegate = delegate, windowLayout = windowLayout, theme = theme, dialogManager = dialogManager, sysUIStateDisplaysInteractor = sysUIStateDisplaysInteractor, ) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialogManager.java +15 −8 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.phone; import android.app.Dialog; import androidx.annotation.NonNull; Loading @@ -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; Loading @@ -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(); } }); } /** Loading @@ -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); Loading Loading @@ -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); } } Loading