Merge "Fix DeviceProvisioned on PhoneStatusBarPolicy" into tm-qpr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
bbc652cc66
@@ -128,6 +128,8 @@ class QuickStatusBarHeaderController extends ViewController<QuickStatusBarHeader
|
|||||||
mPrivacyIconsController.setChipVisibilityListener(this);
|
mPrivacyIconsController.setChipVisibilityListener(this);
|
||||||
mIconContainer.addIgnoredSlot(
|
mIconContainer.addIgnoredSlot(
|
||||||
getResources().getString(com.android.internal.R.string.status_bar_managed_profile));
|
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);
|
mIconContainer.setShouldRestrictIcons(false);
|
||||||
mStatusBarIconController.addIconGroup(mIconManager);
|
mStatusBarIconController.addIconGroup(mIconManager);
|
||||||
|
|
||||||
|
|||||||
@@ -270,6 +270,14 @@ class LargeScreenShadeHeaderController @Inject constructor(
|
|||||||
qsCarrierGroupController = qsCarrierGroupControllerBuilder
|
qsCarrierGroupController = qsCarrierGroupControllerBuilder
|
||||||
.setQSCarrierGroup(qsCarrierGroup)
|
.setQSCarrierGroup(qsCarrierGroup)
|
||||||
.build()
|
.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() {
|
override fun onViewAttached() {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import android.content.SharedPreferences;
|
|||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.os.UserManager;
|
import android.os.UserManager;
|
||||||
@@ -127,7 +128,7 @@ public class PhoneStatusBarPolicy
|
|||||||
private final DateFormatUtil mDateFormatUtil;
|
private final DateFormatUtil mDateFormatUtil;
|
||||||
private final TelecomManager mTelecomManager;
|
private final TelecomManager mTelecomManager;
|
||||||
|
|
||||||
private final Handler mHandler = new Handler();
|
private final Handler mHandler;
|
||||||
private final CastController mCast;
|
private final CastController mCast;
|
||||||
private final HotspotController mHotspot;
|
private final HotspotController mHotspot;
|
||||||
private final NextAlarmController mNextAlarmController;
|
private final NextAlarmController mNextAlarmController;
|
||||||
@@ -166,7 +167,7 @@ public class PhoneStatusBarPolicy
|
|||||||
@Inject
|
@Inject
|
||||||
public PhoneStatusBarPolicy(StatusBarIconController iconController,
|
public PhoneStatusBarPolicy(StatusBarIconController iconController,
|
||||||
CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher,
|
CommandQueue commandQueue, BroadcastDispatcher broadcastDispatcher,
|
||||||
@UiBackground Executor uiBgExecutor, @Main Resources resources,
|
@UiBackground Executor uiBgExecutor, @Main Looper looper, @Main Resources resources,
|
||||||
CastController castController, HotspotController hotspotController,
|
CastController castController, HotspotController hotspotController,
|
||||||
BluetoothController bluetoothController, NextAlarmController nextAlarmController,
|
BluetoothController bluetoothController, NextAlarmController nextAlarmController,
|
||||||
UserInfoController userInfoController, RotationLockController rotationLockController,
|
UserInfoController userInfoController, RotationLockController rotationLockController,
|
||||||
@@ -185,6 +186,7 @@ public class PhoneStatusBarPolicy
|
|||||||
mIconController = iconController;
|
mIconController = iconController;
|
||||||
mCommandQueue = commandQueue;
|
mCommandQueue = commandQueue;
|
||||||
mBroadcastDispatcher = broadcastDispatcher;
|
mBroadcastDispatcher = broadcastDispatcher;
|
||||||
|
mHandler = new Handler(looper);
|
||||||
mResources = resources;
|
mResources = resources;
|
||||||
mCast = castController;
|
mCast = castController;
|
||||||
mHotspot = hotspotController;
|
mHotspot = hotspotController;
|
||||||
@@ -332,6 +334,7 @@ public class PhoneStatusBarPolicy
|
|||||||
mRotationLockController.addCallback(this);
|
mRotationLockController.addCallback(this);
|
||||||
mBluetooth.addCallback(this);
|
mBluetooth.addCallback(this);
|
||||||
mProvisionedController.addCallback(this);
|
mProvisionedController.addCallback(this);
|
||||||
|
mCurrentUserSetup = mProvisionedController.isCurrentUserSetup();
|
||||||
mZenController.addCallback(this);
|
mZenController.addCallback(this);
|
||||||
mCast.addCallback(mCastCallback);
|
mCast.addCallback(mCastCallback);
|
||||||
mHotspot.addCallback(mHotspotCallback);
|
mHotspot.addCallback(mHotspotCallback);
|
||||||
@@ -562,6 +565,7 @@ public class PhoneStatusBarPolicy
|
|||||||
mHandler.post(() -> {
|
mHandler.post(() -> {
|
||||||
updateAlarm();
|
updateAlarm();
|
||||||
updateManagedProfile();
|
updateManagedProfile();
|
||||||
|
onUserSetupChanged();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -192,6 +192,14 @@ class QuickStatusBarHeaderControllerTest : SysuiTestCase() {
|
|||||||
verify(view).setIsSingleCarrier(false)
|
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() {
|
private fun stubViews() {
|
||||||
`when`(view.findViewById<View>(anyInt())).thenReturn(mockView)
|
`when`(view.findViewById<View>(anyInt())).thenReturn(mockView)
|
||||||
`when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup)
|
`when`(view.findViewById<QSCarrierGroup>(R.id.carrier_group)).thenReturn(qsCarrierGroup)
|
||||||
|
|||||||
@@ -607,6 +607,13 @@ class LargeScreenShadeHeaderControllerCombinedTest : SysuiTestCase() {
|
|||||||
verify(mockConstraintsChanges.largeScreenConstraintsChanges)!!.invoke(any())
|
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(
|
private fun createWindowInsets(
|
||||||
topCutout: Rect? = Rect()
|
topCutout: Rect? = Rect()
|
||||||
): WindowInsets {
|
): WindowInsets {
|
||||||
|
|||||||
@@ -191,4 +191,11 @@ class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
|
|||||||
verify(date).setTextAppearance(R.style.TextAppearance_QS_Status)
|
verify(date).setTextAppearance(R.style.TextAppearance_QS_Status)
|
||||||
verify(carrierGroup).updateTextAppearance(R.style.TextAppearance_QS_Status_Carriers)
|
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)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user