Merge "Fix DeviceProvisioned on PhoneStatusBarPolicy" into tm-qpr-dev

This commit is contained in:
Fabian Kozynski
2022-09-02 16:38:13 +00:00
committed by Android (Google) Code Review
7 changed files with 268 additions and 2 deletions

View File

@@ -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);

View File

@@ -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() {

View File

@@ -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();
});
}
};

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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)
)
}
}

View File

@@ -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
)
}
}