diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index e47e636fa4458..6db562107357e 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -84,6 +84,7 @@ import com.android.systemui.statusbar.policy.dagger.SmartRepliesInflationModule; import com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule; import com.android.systemui.statusbar.window.StatusBarWindowModule; import com.android.systemui.telephony.data.repository.TelephonyRepositoryModule; +import com.android.systemui.temporarydisplay.dagger.TemporaryDisplayModule; import com.android.systemui.tuner.dagger.TunerModule; import com.android.systemui.unfold.SysUIUnfoldModule; import com.android.systemui.user.UserModule; @@ -150,6 +151,7 @@ import dagger.Provides; SysUIConcurrencyModule.class, SysUIUnfoldModule.class, TelephonyRepositoryModule.class, + TemporaryDisplayModule.class, TunerModule.class, UserModule.class, UtilModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt index 0a6043793ef66..769494a588425 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt @@ -27,10 +27,11 @@ import com.android.systemui.common.shared.model.Icon /** Utility methods for media tap-to-transfer. */ class MediaTttUtils { companion object { - // Used in CTS tests UpdateMediaTapToTransferSenderDisplayTest and - // UpdateMediaTapToTransferReceiverDisplayTest - const val WINDOW_TITLE = "Media Transfer Chip View" - const val WAKE_REASON = "MEDIA_TRANSFER_ACTIVATED" + const val WINDOW_TITLE_SENDER = "Media Transfer Chip View (Sender)" + const val WINDOW_TITLE_RECEIVER = "Media Transfer Chip View (Receiver)" + + const val WAKE_REASON_SENDER = "MEDIA_TRANSFER_ACTIVATED_SENDER" + const val WAKE_REASON_RECEIVER = "MEDIA_TRANSFER_ACTIVATED_RECEIVER" /** * Returns the information needed to display the icon in [Icon] form. diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt index dc794e66b918f..7dd9fb4b9cd51 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt @@ -40,7 +40,6 @@ import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.media.taptotransfer.common.MediaTttUtils import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.policy.ConfigurationController -import com.android.systemui.temporarydisplay.DEFAULT_TIMEOUT_MILLIS import com.android.systemui.temporarydisplay.TemporaryViewDisplayController import com.android.systemui.temporarydisplay.TemporaryViewInfo import com.android.systemui.util.animation.AnimationUtil.Companion.frames @@ -78,8 +77,6 @@ class MediaTttChipControllerReceiver @Inject constructor( configurationController, powerManager, R.layout.media_ttt_chip_receiver, - MediaTttUtils.WINDOW_TITLE, - MediaTttUtils.WAKE_REASON, ) { @SuppressLint("WrongConstant") // We're allowed to use LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS override val windowLayoutParams = commonWindowLayoutParams.apply { @@ -231,7 +228,7 @@ class MediaTttChipControllerReceiver @Inject constructor( data class ChipReceiverInfo( val routeInfo: MediaRoute2Info, val appIconDrawableOverride: Drawable?, - val appNameOverride: CharSequence? -) : TemporaryViewInfo { - override fun getTimeoutMs() = DEFAULT_TIMEOUT_MILLIS -} + val appNameOverride: CharSequence?, + override val windowTitle: String = MediaTttUtils.WINDOW_TITLE_RECEIVER, + override val wakeReason: String = MediaTttUtils.WAKE_REASON_RECEIVER, +) : TemporaryViewInfo() diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt index 6e596ee1f473b..af7317c208abc 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/ChipStateSender.kt @@ -43,7 +43,7 @@ enum class ChipStateSender( @StringRes val stringResId: Int?, val transferStatus: TransferStatus, val endItem: SenderEndItem?, - val timeout: Long = DEFAULT_TIMEOUT_MILLIS + val timeout: Int = DEFAULT_TIMEOUT_MILLIS, ) { /** * A state representing that the two devices are close but not close enough to *start* a cast to @@ -223,6 +223,6 @@ sealed class SenderEndItem { // Give the Transfer*Triggered states a longer timeout since those states represent an active // process and we should keep the user informed about it as long as possible (but don't allow it to // continue indefinitely). -private const val TRANSFER_TRIGGERED_TIMEOUT_MILLIS = 30000L +private const val TRANSFER_TRIGGERED_TIMEOUT_MILLIS = 30000 private const val TAG = "ChipStateSender" diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt index 1fa8faeecd827..d1ea2d0c83bdb 100644 --- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt @@ -159,6 +159,9 @@ constructor( } }, vibrationEffect = chipStateSender.transferStatus.vibrationEffect, + windowTitle = MediaTttUtils.WINDOW_TITLE_SENDER, + wakeReason = MediaTttUtils.WAKE_REASON_SENDER, + timeoutMs = chipStateSender.timeout, ) } diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt index f0a50de02b3a5..637fac05f0b6d 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt @@ -44,11 +44,6 @@ import com.android.systemui.util.concurrency.DelayableExecutor * * The generic type T is expected to contain all the information necessary for the subclasses to * display the view in a certain state, since they receive in [updateView]. - * - * @property windowTitle the title to use for the window that displays the temporary view. Should be - * normally cased, like "Window Title". - * @property wakeReason a string used for logging if we needed to wake the screen in order to - * display the temporary view. Should be screaming snake cased, like WAKE_REASON. */ abstract class TemporaryViewDisplayController( internal val context: Context, @@ -59,8 +54,6 @@ abstract class TemporaryViewDisplayController( +) : TemporaryViewDisplayController( context, logger, windowManager, @@ -90,8 +84,6 @@ open class ChipbarCoordinator @Inject constructor( configurationController, powerManager, R.layout.chipbar, - MediaTttUtils.WINDOW_TITLE, - MediaTttUtils.WAKE_REASON, ) { private lateinit var parent: ChipbarRootView @@ -106,7 +98,16 @@ open class ChipbarCoordinator @Inject constructor( newInfo: ChipbarInfo, currentView: ViewGroup ) { - // TODO(b/245610654): Adding logging here. + logger.logViewUpdate( + newInfo.windowTitle, + newInfo.text.loadText(context), + when (newInfo.endItem) { + null -> "null" + is ChipbarEndItem.Loading -> "loading" + is ChipbarEndItem.Error -> "error" + is ChipbarEndItem.Button -> "button(${newInfo.endItem.text.loadText(context)})" + } + ) // Detect falsing touches on the chip. parent = currentView.requireViewById(R.id.chipbar_root_view) diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt index 57fde87114d02..6237365d0cee0 100644 --- a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarInfo.kt @@ -37,7 +37,10 @@ data class ChipbarInfo( val text: Text, val endItem: ChipbarEndItem?, val vibrationEffect: VibrationEffect? = null, -) : TemporaryViewInfo + override val windowTitle: String, + override val wakeReason: String, + override val timeoutMs: Int, +) : TemporaryViewInfo() /** The possible items to display at the end of the chipbar. */ sealed class ChipbarEndItem { diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt new file mode 100644 index 0000000000000..e477cd68673ab --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarLogger.kt @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.temporarydisplay.chipbar + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.plugins.log.LogBuffer +import com.android.systemui.plugins.log.LogLevel +import com.android.systemui.temporarydisplay.TemporaryViewLogger +import com.android.systemui.temporarydisplay.dagger.ChipbarLog +import javax.inject.Inject + +/** A logger for the chipbar. */ +@SysUISingleton +class ChipbarLogger +@Inject +constructor( + @ChipbarLog buffer: LogBuffer, +) : TemporaryViewLogger(buffer, "ChipbarLog") { + /** + * Logs that the chipbar was updated to display in a window named [windowTitle], with [text] and + * [endItemDesc]. + */ + fun logViewUpdate(windowTitle: String, text: String?, endItemDesc: String) { + buffer.log( + tag, + LogLevel.DEBUG, + { + str1 = windowTitle + str2 = text + str3 = endItemDesc + }, + { "Chipbar updated. window=$str1 text=$str2 endItem=$str3" } + ) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/ChipbarLog.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/ChipbarLog.kt new file mode 100644 index 0000000000000..5f101f2f388d0 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/ChipbarLog.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.temporarydisplay.dagger + +import javax.inject.Qualifier + +/** Status bar connectivity logs in table format. */ +@Qualifier +@MustBeDocumented +@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) +annotation class ChipbarLog diff --git a/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt new file mode 100644 index 0000000000000..cf0a1835c8e89 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/temporarydisplay/dagger/TemporaryDisplayModule.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.temporarydisplay.dagger + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.log.LogBufferFactory +import com.android.systemui.plugins.log.LogBuffer +import dagger.Module +import dagger.Provides + +@Module +interface TemporaryDisplayModule { + @Module + companion object { + @JvmStatic + @Provides + @SysUISingleton + @ChipbarLog + fun provideChipbarLogBuffer(factory: LogBufferFactory): LogBuffer { + return factory.create("ChipbarLog", 40) + } + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt index fdeb3f5eb8577..ad19bc2a80e09 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt @@ -45,6 +45,7 @@ import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.temporarydisplay.chipbar.ChipbarCoordinator +import com.android.systemui.temporarydisplay.chipbar.ChipbarLogger import com.android.systemui.temporarydisplay.chipbar.FakeChipbarCoordinator import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any @@ -80,6 +81,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var falsingManager: FalsingManager @Mock private lateinit var falsingCollector: FalsingCollector + @Mock private lateinit var chipbarLogger: ChipbarLogger @Mock private lateinit var logger: MediaTttLogger @Mock private lateinit var mediaTttFlags: MediaTttFlags @Mock private lateinit var packageManager: PackageManager @@ -122,7 +124,7 @@ class MediaTttSenderCoordinatorTest : SysuiTestCase() { chipbarCoordinator = FakeChipbarCoordinator( context, - logger, + chipbarLogger, windowManager, fakeExecutor, accessibilityManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt index b68eb88d46db2..91b5c35d96618 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt @@ -41,6 +41,7 @@ import org.junit.Test import org.mockito.Mock import org.mockito.Mockito.never import org.mockito.Mockito.reset +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations @@ -85,10 +86,29 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { } @Test - fun displayView_viewAdded() { - underTest.displayView(getState()) + fun displayView_viewAddedWithCorrectTitle() { + underTest.displayView( + ViewInfo( + name = "name", + windowTitle = "Fake Window Title", + ) + ) - verify(windowManager).addView(any(), any()) + val windowParamsCaptor = argumentCaptor() + verify(windowManager).addView(any(), capture(windowParamsCaptor)) + assertThat(windowParamsCaptor.value!!.title).isEqualTo("Fake Window Title") + } + + @Test + fun displayView_logged() { + underTest.displayView( + ViewInfo( + name = "name", + windowTitle = "Fake Window Title", + ) + ) + + verify(logger).logViewAddition("Fake Window Title") } @Test @@ -110,7 +130,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { } @Test - fun displayView_twice_viewNotAddedTwice() { + fun displayView_twiceWithSameWindowTitle_viewNotAddedTwice() { underTest.displayView(getState()) reset(windowManager) @@ -118,6 +138,32 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { verify(windowManager, never()).addView(any(), any()) } + @Test + fun displayView_twiceWithDifferentWindowTitles_oldViewRemovedNewViewAdded() { + underTest.displayView( + ViewInfo( + name = "name", + windowTitle = "First Fake Window Title", + ) + ) + + underTest.displayView( + ViewInfo( + name = "name", + windowTitle = "Second Fake Window Title", + ) + ) + + val viewCaptor = argumentCaptor() + val windowParamsCaptor = argumentCaptor() + + verify(windowManager, times(2)).addView(capture(viewCaptor), capture(windowParamsCaptor)) + + assertThat(windowParamsCaptor.allValues[0].title).isEqualTo("First Fake Window Title") + assertThat(windowParamsCaptor.allValues[1].title).isEqualTo("Second Fake Window Title") + verify(windowManager).removeView(viewCaptor.allValues[0]) + } + @Test fun displayView_viewDoesNotDisappearsBeforeTimeout() { val state = getState() @@ -197,7 +243,7 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { underTest.removeView(reason) verify(windowManager).removeView(any()) - verify(logger).logChipRemoval(reason) + verify(logger).logViewRemoval(reason) } @Test @@ -232,8 +278,6 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { configurationController, powerManager, R.layout.chipbar, - "Window Title", - "WAKE_REASON", ) { var mostRecentViewInfo: ViewInfo? = null @@ -250,9 +294,12 @@ class TemporaryViewDisplayControllerTest : SysuiTestCase() { } } - inner class ViewInfo(val name: String) : TemporaryViewInfo { - override fun getTimeoutMs() = 1L - } + inner class ViewInfo( + val name: String, + override val windowTitle: String = "Window Title", + override val wakeReason: String = "WAKE_REASON", + override val timeoutMs: Int = 1 + ) : TemporaryViewInfo() } private const val TIMEOUT_MS = 10000L diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt index 13e9f608158e1..d155050ce932d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/TemporaryViewLoggerTest.kt @@ -43,20 +43,21 @@ class TemporaryViewLoggerTest : SysuiTestCase() { } @Test - fun logChipAddition_bufferHasLog() { - logger.logChipAddition() + fun logViewAddition_bufferHasLog() { + logger.logViewAddition("Test Window Title") val stringWriter = StringWriter() buffer.dump(PrintWriter(stringWriter), tailLength = 0) val actualString = stringWriter.toString() assertThat(actualString).contains(TAG) + assertThat(actualString).contains("Test Window Title") } @Test - fun logChipRemoval_bufferHasTagAndReason() { + fun logViewRemoval_bufferHasTagAndReason() { val reason = "test reason" - logger.logChipRemoval(reason) + logger.logViewRemoval(reason) val stringWriter = StringWriter() buffer.dump(PrintWriter(stringWriter), tailLength = 0) diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt index 9fbf159ec3483..f64397325867c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt @@ -35,12 +35,12 @@ import com.android.systemui.common.shared.model.ContentDescription import com.android.systemui.common.shared.model.ContentDescription.Companion.loadContentDescription import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Text -import com.android.systemui.media.taptotransfer.common.MediaTttLogger import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any +import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.view.ViewUtil import com.google.common.truth.Truth.assertThat @@ -60,7 +60,7 @@ import org.mockito.MockitoAnnotations class ChipbarCoordinatorTest : SysuiTestCase() { private lateinit var underTest: FakeChipbarCoordinator - @Mock private lateinit var logger: MediaTttLogger + @Mock private lateinit var logger: ChipbarLogger @Mock private lateinit var accessibilityManager: AccessibilityManager @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var powerManager: PowerManager @@ -105,7 +105,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { val drawable = context.getDrawable(R.drawable.ic_celebration)!! underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Loaded(drawable, contentDescription = ContentDescription.Loaded("loadedCD")), Text.Loaded("text"), endItem = null, @@ -121,7 +121,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { fun displayView_resourceIcon_correctlyRendered() { val contentDescription = ContentDescription.Resource(R.string.controls_error_timeout) underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.drawable.ic_cake, contentDescription), Text.Loaded("text"), endItem = null, @@ -136,7 +136,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_loadedText_correctlyRendered() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("display view text here"), endItem = null, @@ -149,7 +149,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_resourceText_correctlyRendered() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Resource(R.string.screenrecord_start_error), endItem = null, @@ -163,7 +163,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_endItemNull_correctlyRendered() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = null, @@ -179,7 +179,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_endItemLoading_correctlyRendered() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = ChipbarEndItem.Loading, @@ -195,7 +195,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_endItemError_correctlyRendered() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = ChipbarEndItem.Error, @@ -211,7 +211,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_endItemButton_correctlyRendered() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = @@ -237,7 +237,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { val buttonClickListener = View.OnClickListener { isClicked = true } underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = @@ -260,7 +260,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { val buttonClickListener = View.OnClickListener { isClicked = true } underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = @@ -279,7 +279,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { @Test fun displayView_vibrationEffect_doubleClickEffect() { underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Resource(R.id.check_box, null), Text.Loaded("text"), endItem = null, @@ -296,7 +296,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { val drawable = context.getDrawable(R.drawable.ic_celebration)!! underTest.displayView( - ChipbarInfo( + createChipbarInfo( Icon.Loaded(drawable, contentDescription = ContentDescription.Loaded("loadedCD")), Text.Loaded("title text"), endItem = ChipbarEndItem.Loading, @@ -314,7 +314,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() { // WHEN the view is updated val newDrawable = context.getDrawable(R.drawable.ic_cake)!! underTest.updateView( - ChipbarInfo( + createChipbarInfo( Icon.Loaded(newDrawable, ContentDescription.Loaded("new CD")), Text.Loaded("new title text"), endItem = ChipbarEndItem.Error, @@ -331,6 +331,47 @@ class ChipbarCoordinatorTest : SysuiTestCase() { assertThat(chipbarView.getEndButton().visibility).isEqualTo(View.GONE) } + @Test + fun viewUpdates_logged() { + val drawable = context.getDrawable(R.drawable.ic_celebration)!! + underTest.displayView( + createChipbarInfo( + Icon.Loaded(drawable, contentDescription = ContentDescription.Loaded("loadedCD")), + Text.Loaded("title text"), + endItem = ChipbarEndItem.Loading, + ) + ) + + verify(logger).logViewUpdate(eq(WINDOW_TITLE), eq("title text"), any()) + + underTest.displayView( + createChipbarInfo( + Icon.Loaded(drawable, ContentDescription.Loaded("new CD")), + Text.Loaded("new title text"), + endItem = ChipbarEndItem.Error, + ) + ) + + verify(logger).logViewUpdate(eq(WINDOW_TITLE), eq("new title text"), any()) + } + + private fun createChipbarInfo( + startIcon: Icon, + text: Text, + endItem: ChipbarEndItem?, + vibrationEffect: VibrationEffect? = null, + ): ChipbarInfo { + return ChipbarInfo( + startIcon, + text, + endItem, + vibrationEffect, + windowTitle = WINDOW_TITLE, + wakeReason = WAKE_REASON, + timeoutMs = TIMEOUT, + ) + } + private fun ViewGroup.getStartIconView() = this.requireViewById(R.id.start_icon) private fun ViewGroup.getChipText(): String = @@ -350,3 +391,5 @@ class ChipbarCoordinatorTest : SysuiTestCase() { } private const val TIMEOUT = 10000 +private const val WINDOW_TITLE = "Test Chipbar Window Title" +private const val WAKE_REASON = "TEST_CHIPBAR_WAKE_REASON" diff --git a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/FakeChipbarCoordinator.kt b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/FakeChipbarCoordinator.kt index 17d402319246b..574f70e7fddc1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/FakeChipbarCoordinator.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/temporarydisplay/chipbar/FakeChipbarCoordinator.kt @@ -22,8 +22,6 @@ import android.view.ViewGroup import android.view.WindowManager import android.view.accessibility.AccessibilityManager import com.android.systemui.classifier.FalsingCollector -import com.android.systemui.media.taptotransfer.common.MediaTttLogger -import com.android.systemui.media.taptotransfer.receiver.MediaTttReceiverLogger import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.ConfigurationController @@ -33,7 +31,7 @@ import com.android.systemui.util.view.ViewUtil /** A fake implementation of [ChipbarCoordinator] for testing. */ class FakeChipbarCoordinator( context: Context, - @MediaTttReceiverLogger logger: MediaTttLogger, + logger: ChipbarLogger, windowManager: WindowManager, mainExecutor: DelayableExecutor, accessibilityManager: AccessibilityManager,