diff options
| author | 2022-09-02 16:45:52 +0000 | |
|---|---|---|
| committer | 2022-09-02 16:45:52 +0000 | |
| commit | a1c2ef3a022da54bb54b572b2bae9df2f3b5fb22 (patch) | |
| tree | 090602a270156c8cde6861cce1a30051348f8d22 | |
| parent | 47196b1422f94f9679b622b1c364f5dffd67c3ab (diff) | |
| parent | bbc652cc66d941eedb8e67d5dfb6eda971d293b9 (diff) | |
Merge "Fix DeviceProvisioned on PhoneStatusBarPolicy" into tm-qpr-dev am: bbc652cc66
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19745525
Change-Id: Icd3efdc90058bd3c312a9b13abdae158d657e697
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
7 files changed, 268 insertions, 2 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java index 2a6cf66995ea..b5859616f392 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeaderController.java @@ -128,6 +128,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader mPrivacyIconsController.setChipVisibilityListener(this); mIconContainer.addIgnoredSlot( getResources().getString(com.android.internal.R.string.status_bar_managed_profile)); + mIconContainer.addIgnoredSlot( + getResources().getString(com.android.internal.R.string.status_bar_alarm_clock)); mIconContainer.setShouldRestrictIcons(false); mStatusBarIconController.addIconGroup(mIconManager); diff --git a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt index fab70fc2eebd..6b32daff0ab1 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/LargeScreenShadeHeaderController.kt @@ -270,6 +270,14 @@ class LargeScreenShadeHeaderController @Inject constructor( qsCarrierGroupController = qsCarrierGroupControllerBuilder .setQSCarrierGroup(qsCarrierGroup) .build() + + if (!combinedHeaders) { + // In the new header, we display alarm icon but we ignore it when not using the new + // headers. + iconContainer.addIgnoredSlot( + context.getString(com.android.internal.R.string.status_bar_alarm_clock) + ) + } } override fun onViewAttached() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 290df3e3e1af..48e58fcb584d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -33,6 +33,7 @@ import android.content.SharedPreferences; import android.content.res.Resources; import android.media.AudioManager; import android.os.Handler; +import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; @@ -127,7 +128,7 @@ public class PhoneStatusBarPolicy private final DateFormatUtil mDateFormatUtil; private final TelecomManager mTelecomManager; - private final Handler mHandler = new Handler(); + private final Handler mHandler; private final CastController mCast; private final HotspotController mHotspot; private final NextAlarmController mNextAlarmController; @@ -166,7 +167,7 @@ public class PhoneStatusBarPolicy @Inject public PhoneStatusBarPolicy(StatusBarIconController iconController, CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher, - @UiBackground Executor uiBgExecutor, @Main Resources resources, + @UiBackground Executor uiBgExecutor, @Main Looper looper, @Main Resources resources, CastController castController, HotspotController hotspotController, BluetoothController bluetoothController, NextAlarmController nextAlarmController, UserInfoController userInfoController, RotationLockController rotationLockController, @@ -185,6 +186,7 @@ public class PhoneStatusBarPolicy mIconController = iconController; mCommandQueue = commandQueue; mBroadcastDispatcher = broadcastDispatcher; + mHandler = new Handler(looper); mResources = resources; mCast = castController; mHotspot = hotspotController; @@ -332,6 +334,7 @@ public class PhoneStatusBarPolicy mRotationLockController.addCallback(this); mBluetooth.addCallback(this); mProvisionedController.addCallback(this); + mCurrentUserSetup = mProvisionedController.isCurrentUserSetup(); mZenController.addCallback(this); mCast.addCallback(mCastCallback); mHotspot.addCallback(mHotspotCallback); @@ -562,6 +565,7 @@ public class PhoneStatusBarPolicy mHandler.post(() -> { updateAlarm(); updateManagedProfile(); + onUserSetupChanged(); }); } }; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt index cb4f08e6c552..eb907bd92471 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QuickStatusBarHeaderControllerTest.kt @@ -192,6 +192,14 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() { verify(view).setIsSingleCarrier(false) } + @Test + fun testAlarmIconIgnored() { + controller.init() + + verify(iconContainer).addIgnoredSlot( + mContext.getString(com.android.internal.R.string.status_bar_alarm_clock)) + } + private fun stubViews() { `when`(view.findViewById<View>(anyInt())).thenReturn(mockView) `when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup) diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerCombinedTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerCombinedTest.kt index 20c6d9adc300..e85ffb68de54 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerCombinedTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerCombinedTest.kt @@ -607,6 +607,13 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() { verify(mockConstraintsChanges.largeScreenConstraintsChanges)!!.invoke(any()) } + @Test + fun alarmIconNotIgnored() { + verify(statusIcons, never()).addIgnoredSlot( + context.getString(com.android.internal.R.string.status_bar_alarm_clock) + ) + } + private fun createWindowInsets( topCutout: Rect? = Rect() ): WindowInsets { diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt index eeb61bc8a0f8..8511443705e4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/LargeScreenShadeHeaderControllerTest.kt @@ -191,4 +191,11 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() { verify(date).setTextAppearance(R.style.TextAppearance_QS_Status) verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status_Carriers) } + + @Test + fun alarmIconIgnored() { + verify(statusIcons).addIgnoredSlot( + context.getString(com.android.internal.R.string.status_bar_alarm_clock) + ) + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt new file mode 100644 index 000000000000..64dee956fcc1 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicyTest.kt @@ -0,0 +1,230 @@ +/* + * 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.statusbar.phone + +import android.app.AlarmManager +import android.app.IActivityManager +import android.app.admin.DevicePolicyManager +import android.content.SharedPreferences +import android.os.UserManager +import android.telecom.TelecomManager +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.broadcast.BroadcastDispatcher +import com.android.systemui.privacy.PrivacyItemController +import com.android.systemui.privacy.logging.PrivacyLogger +import com.android.systemui.screenrecord.RecordingController +import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.statusbar.policy.BluetoothController +import com.android.systemui.statusbar.policy.CastController +import com.android.systemui.statusbar.policy.DataSaverController +import com.android.systemui.statusbar.policy.DeviceProvisionedController +import com.android.systemui.statusbar.policy.HotspotController +import com.android.systemui.statusbar.policy.KeyguardStateController +import com.android.systemui.statusbar.policy.LocationController +import com.android.systemui.statusbar.policy.NextAlarmController +import com.android.systemui.statusbar.policy.RotationLockController +import com.android.systemui.statusbar.policy.SensorPrivacyController +import com.android.systemui.statusbar.policy.UserInfoController +import com.android.systemui.statusbar.policy.ZenModeController +import com.android.systemui.util.RingerModeTracker +import com.android.systemui.util.concurrency.FakeExecutor +import com.android.systemui.util.mockito.capture +import com.android.systemui.util.time.DateFormatUtil +import com.android.systemui.util.time.FakeSystemClock +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Answers +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.anyInt +import org.mockito.Mockito.never +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations + +@RunWith(AndroidTestingRunner::class) +@RunWithLooper +@SmallTest +class PhoneStatusBarPolicyTest : SysuiTestCase() { + + companion object { + private const val ALARM_SLOT = "alarm" + } + + @Mock + private lateinit var iconController: StatusBarIconController + @Mock + private lateinit var commandQueue: CommandQueue + @Mock + private lateinit var broadcastDispatcher: BroadcastDispatcher + @Mock + private lateinit var castController: CastController + @Mock + private lateinit var hotspotController: HotspotController + @Mock + private lateinit var bluetoothController: BluetoothController + @Mock + private lateinit var nextAlarmController: NextAlarmController + @Mock + private lateinit var userInfoController: UserInfoController + @Mock + private lateinit var rotationLockController: RotationLockController + @Mock + private lateinit var dataSaverController: DataSaverController + @Mock + private lateinit var zenModeController: ZenModeController + @Mock + private lateinit var deviceProvisionedController: DeviceProvisionedController + @Mock + private lateinit var keyguardStateController: KeyguardStateController + @Mock + private lateinit var locationController: LocationController + @Mock + private lateinit var sensorPrivacyController: SensorPrivacyController + @Mock + private lateinit var iActivityManager: IActivityManager + @Mock + private lateinit var alarmManager: AlarmManager + @Mock + private lateinit var userManager: UserManager + @Mock + private lateinit var devicePolicyManager: DevicePolicyManager + @Mock + private lateinit var recordingController: RecordingController + @Mock + private lateinit var telecomManager: TelecomManager + @Mock + private lateinit var sharedPreferences: SharedPreferences + @Mock + private lateinit var dateFormatUtil: DateFormatUtil + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private lateinit var ringerModeTracker: RingerModeTracker + @Mock + private lateinit var privacyItemController: PrivacyItemController + @Mock + private lateinit var privacyLogger: PrivacyLogger + @Captor + private lateinit var alarmCallbackCaptor: + ArgumentCaptor<NextAlarmController.NextAlarmChangeCallback> + + private lateinit var executor: FakeExecutor + private lateinit var statusBarPolicy: PhoneStatusBarPolicy + private lateinit var testableLooper: TestableLooper + + @Before + fun setUp() { + MockitoAnnotations.initMocks(this) + executor = FakeExecutor(FakeSystemClock()) + testableLooper = TestableLooper.get(this) + context.orCreateTestableResources.addOverride( + com.android.internal.R.string.status_bar_alarm_clock, + ALARM_SLOT + ) + statusBarPolicy = createStatusBarPolicy() + } + + @Test + fun testDeviceNotProvisioned_alarmIconNotShown() { + val alarmInfo = createAlarmInfo() + + whenever(deviceProvisionedController.isCurrentUserSetup).thenReturn(false) + statusBarPolicy.init() + verify(nextAlarmController).addCallback(capture(alarmCallbackCaptor)) + + whenever(alarmManager.getNextAlarmClock(anyInt())).thenReturn(alarmInfo) + + alarmCallbackCaptor.value.onNextAlarmChanged(alarmInfo) + verify(iconController, never()).setIconVisibility(ALARM_SLOT, true) + } + + @Test + fun testDeviceProvisioned_alarmIconShown() { + val alarmInfo = createAlarmInfo() + + whenever(deviceProvisionedController.isCurrentUserSetup).thenReturn(true) + statusBarPolicy.init() + + verify(nextAlarmController).addCallback(capture(alarmCallbackCaptor)) + whenever(alarmManager.getNextAlarmClock(anyInt())).thenReturn(alarmInfo) + + alarmCallbackCaptor.value.onNextAlarmChanged(alarmInfo) + verify(iconController).setIconVisibility(ALARM_SLOT, true) + } + + @Test + fun testDeviceProvisionedChanged_alarmIconShownAfterCurrentUserSetup() { + val alarmInfo = createAlarmInfo() + + whenever(deviceProvisionedController.isCurrentUserSetup).thenReturn(false) + statusBarPolicy.init() + + verify(nextAlarmController).addCallback(capture(alarmCallbackCaptor)) + whenever(alarmManager.getNextAlarmClock(anyInt())).thenReturn(alarmInfo) + + alarmCallbackCaptor.value.onNextAlarmChanged(alarmInfo) + verify(iconController, never()).setIconVisibility(ALARM_SLOT, true) + + whenever(deviceProvisionedController.isCurrentUserSetup).thenReturn(true) + statusBarPolicy.onUserSetupChanged() + verify(iconController).setIconVisibility(ALARM_SLOT, true) + } + + private fun createAlarmInfo(): AlarmManager.AlarmClockInfo { + return AlarmManager.AlarmClockInfo(10L, null) + } + + private fun createStatusBarPolicy(): PhoneStatusBarPolicy { + return PhoneStatusBarPolicy( + iconController, + commandQueue, + broadcastDispatcher, + executor, + testableLooper.looper, + context.resources, + castController, + hotspotController, + bluetoothController, + nextAlarmController, + userInfoController, + rotationLockController, + dataSaverController, + zenModeController, + deviceProvisionedController, + keyguardStateController, + locationController, + sensorPrivacyController, + iActivityManager, + alarmManager, + userManager, + devicePolicyManager, + recordingController, + telecomManager, + /* displayId = */ 0, + sharedPreferences, + dateFormatUtil, + ringerModeTracker, + privacyItemController, + privacyLogger + ) + } +} |