From ed47616d6c078b6cb3d2e6c00c55676e5f79a7a9 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 22 Oct 2020 10:20:56 -0400 Subject: [PATCH] Retrieve privacy flags before setting ignored slots Before this CL, onViewAttached will never set any ignored slots, as all the flags were false at the point setIgnoredSlots is called. Test: manual Test: atest QuickStatusBarHeaderControllerTest Change-Id: Ifeaab6eb45fe94026cefcbd018d5d283406d40ae --- .../qs/QuickStatusBarHeaderController.java | 21 +- .../qs/QuickStatusBarHeaderControllerTest.kt | 230 ++++++++++++++++++ 2 files changed, 241 insertions(+), 10 deletions(-) create mode 100644 packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index febb71c3223bf..44f847c34e2bb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -257,15 +257,15 @@ class QuickStatusBarHeaderController extends ViewController getIgnoredIconSlots() { ArrayList ignored = new ArrayList<>(); if (getChipEnabled()) { - ignored.add(mView.getResources().getString( - com.android.internal.R.string.status_bar_camera)); - ignored.add(mView.getResources().getString( - com.android.internal.R.string.status_bar_microphone)); + if (mAllIndicatorsEnabled || mMicCameraIndicatorsEnabled) { + ignored.add(mView.getResources().getString( + com.android.internal.R.string.status_bar_camera)); + ignored.add(mView.getResources().getString( + com.android.internal.R.string.status_bar_microphone)); + } if (mAllIndicatorsEnabled || mLocationIndicatorsEnabled) { ignored.add(mView.getResources().getString( com.android.internal.R.string.status_bar_location)); } } - return ignored; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt new file mode 100644 index 0000000000000..2269951988430 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt @@ -0,0 +1,230 @@ +/* + * Copyright (C) 2020 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.qs + +import android.content.Context +import android.testing.AndroidTestingRunner +import android.view.View +import androidx.test.filters.SmallTest +import com.android.internal.logging.UiEventLogger +import com.android.systemui.R +import com.android.systemui.SysuiTestCase +import com.android.systemui.demomode.DemoModeController +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.privacy.OngoingPrivacyChip +import com.android.systemui.privacy.PrivacyItemController +import com.android.systemui.qs.carrier.QSCarrierGroup +import com.android.systemui.qs.carrier.QSCarrierGroupController +import com.android.systemui.settings.UserTracker +import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.statusbar.phone.StatusBarIconController +import com.android.systemui.statusbar.phone.StatusIconContainer +import com.android.systemui.statusbar.policy.Clock +import com.android.systemui.statusbar.policy.NextAlarmController +import com.android.systemui.util.RingerModeTracker +import com.android.systemui.util.mockito.argumentCaptor +import com.android.systemui.util.mockito.capture +import com.android.systemui.utils.leaks.FakeZenModeController +import com.google.common.truth.Truth.assertThat +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Answers +import org.mockito.ArgumentMatchers.anyInt +import org.mockito.Mock +import org.mockito.Mockito.`when` +import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidTestingRunner::class) +class QuickStatusBarHeaderControllerTest : SysuiTestCase() { + + @Mock + private lateinit var view: QuickStatusBarHeader + @Mock + private lateinit var zenModeController: FakeZenModeController + @Mock + private lateinit var nextAlarmController: NextAlarmController + @Mock + private lateinit var privacyItemController: PrivacyItemController + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private lateinit var ringerModeTracker: RingerModeTracker + @Mock + private lateinit var activityStarter: ActivityStarter + @Mock + private lateinit var uiEventLogger: UiEventLogger + @Mock + private lateinit var qsTileHost: QSTileHost + @Mock + private lateinit var statusBarIconController: StatusBarIconController + @Mock + private lateinit var commandQueue: CommandQueue + @Mock + private lateinit var demoModeController: DemoModeController + @Mock + private lateinit var userTracker: UserTracker + @Mock + private lateinit var quickQSPanelController: QuickQSPanelController + @Mock(answer = Answers.RETURNS_SELF) + private lateinit var qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder + @Mock + private lateinit var qsCarrierGroupController: QSCarrierGroupController + @Mock + private lateinit var iconContainer: StatusIconContainer + @Mock + private lateinit var qsCarrierGroup: QSCarrierGroup + @Mock + private lateinit var privacyChip: OngoingPrivacyChip + @Mock + private lateinit var clock: Clock + @Mock + private lateinit var mockView: View + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private lateinit var context: Context + + private lateinit var controller: QuickStatusBarHeaderController + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + stubViews() + `when`(iconContainer.context).thenReturn(context) + `when`(qsCarrierGroupControllerBuilder.build()).thenReturn(qsCarrierGroupController) + `when`(view.resources).thenReturn(mContext.resources) + `when`(view.isAttachedToWindow).thenReturn(true) + + controller = QuickStatusBarHeaderController( + view, + zenModeController, + nextAlarmController, + privacyItemController, + ringerModeTracker, + activityStarter, + uiEventLogger, + qsTileHost, + statusBarIconController, + commandQueue, + demoModeController, + userTracker, + quickQSPanelController, + qsCarrierGroupControllerBuilder + ) + } + + @After + fun tearDown() { + controller.onViewDetached() + } + + @Test + fun testIgnoredSlotsOnAttached_noIndicators() { + setPrivacyController(false, false, false) + + controller.init() + + val captor = argumentCaptor>() + verify(iconContainer).setIgnoredSlots(capture(captor)) + + assertThat(captor.value).isEmpty() + } + + @Test + fun testIgnoredSlotsOnAttached_onlyMicCamera() { + setPrivacyController(false, true, false) + + controller.init() + + val captor = argumentCaptor>() + verify(iconContainer).setIgnoredSlots(capture(captor)) + + val cameraString = mContext.resources.getString( + com.android.internal.R.string.status_bar_camera) + val micString = mContext.resources.getString( + com.android.internal.R.string.status_bar_microphone) + + assertThat(captor.value).containsExactly(cameraString, micString) + } + + @Test + fun testIgnoredSlotsOnAttached_onlyLocation() { + setPrivacyController(false, false, true) + + controller.init() + + val captor = argumentCaptor>() + verify(iconContainer).setIgnoredSlots(capture(captor)) + + val locationString = mContext.resources.getString( + com.android.internal.R.string.status_bar_location) + + assertThat(captor.value).containsExactly(locationString) + } + + @Test + fun testIgnoredSlotsOnAttached_locationMicCamera() { + setPrivacyController(false, true, true) + + controller.init() + + val captor = argumentCaptor>() + verify(iconContainer).setIgnoredSlots(capture(captor)) + + val cameraString = mContext.resources.getString( + com.android.internal.R.string.status_bar_camera) + val micString = mContext.resources.getString( + com.android.internal.R.string.status_bar_microphone) + val locationString = mContext.resources.getString( + com.android.internal.R.string.status_bar_location) + + assertThat(captor.value).containsExactly(cameraString, micString, locationString) + } + + @Test + fun testIgnoredSlotsOnAttached_all() { + setPrivacyController(true, false, false) + + controller.init() + + val captor = argumentCaptor>() + verify(iconContainer).setIgnoredSlots(capture(captor)) + + val cameraString = mContext.resources.getString( + com.android.internal.R.string.status_bar_camera) + val micString = mContext.resources.getString( + com.android.internal.R.string.status_bar_microphone) + val locationString = mContext.resources.getString( + com.android.internal.R.string.status_bar_location) + + assertThat(captor.value).containsExactly(cameraString, micString, locationString) + } + + private fun stubViews() { + `when`(view.findViewById(anyInt())).thenReturn(mockView) + `when`(view.findViewById(R.id.carrier_group)).thenReturn(qsCarrierGroup) + `when`(view.findViewById(R.id.statusIcons)).thenReturn(iconContainer) + `when`(view.findViewById(R.id.privacy_chip)).thenReturn(privacyChip) + `when`(view.findViewById(R.id.clock)).thenReturn(clock) + } + + private fun setPrivacyController(all: Boolean, micCamera: Boolean, location: Boolean) { + `when`(privacyItemController.allIndicatorsAvailable).thenReturn(all) + `when`(privacyItemController.micCameraAvailable).thenReturn(micCamera) + `when`(privacyItemController.locationAvailable).thenReturn(location) + } +} \ No newline at end of file