Merge changes Id3a155a2,Ifbb9dfe3 into tm-qpr-dev
* changes: Disable shade open when FRP is active Add FRP setting to DeviceProvisionController
This commit is contained in:
@@ -3571,7 +3571,8 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
|
|||||||
boolean goingToSleepWithoutAnimation = isGoingToSleep()
|
boolean goingToSleepWithoutAnimation = isGoingToSleep()
|
||||||
&& !mDozeParameters.shouldControlScreenOff();
|
&& !mDozeParameters.shouldControlScreenOff();
|
||||||
boolean disabled = (!mDeviceInteractive && !mDozeServiceHost.isPulsing())
|
boolean disabled = (!mDeviceInteractive && !mDozeServiceHost.isPulsing())
|
||||||
|| goingToSleepWithoutAnimation;
|
|| goingToSleepWithoutAnimation
|
||||||
|
|| mDeviceProvisionedController.isFrpActive();
|
||||||
mNotificationPanelViewController.setTouchAndAnimationDisabled(disabled);
|
mNotificationPanelViewController.setTouchAndAnimationDisabled(disabled);
|
||||||
mNotificationIconAreaController.setAnimationsEnabled(!disabled);
|
mNotificationIconAreaController.setAnimationsEnabled(!disabled);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,8 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceP
|
|||||||
/**
|
/**
|
||||||
* Controller to cache in process the state of the device provisioning.
|
* Controller to cache in process the state of the device provisioning.
|
||||||
* <p>
|
* <p>
|
||||||
* This controller keeps track of the values of device provisioning and user setup complete
|
* This controller keeps track of the values of device provisioning, user setup complete, and
|
||||||
|
* whether Factory Reset Protection is active.
|
||||||
*/
|
*/
|
||||||
public interface DeviceProvisionedController extends CallbackController<DeviceProvisionedListener> {
|
public interface DeviceProvisionedController extends CallbackController<DeviceProvisionedListener> {
|
||||||
|
|
||||||
@@ -49,6 +50,9 @@ public interface DeviceProvisionedController extends CallbackController<DevicePr
|
|||||||
*/
|
*/
|
||||||
boolean isCurrentUserSetup();
|
boolean isCurrentUserSetup();
|
||||||
|
|
||||||
|
/** Returns true when Factory Reset Protection is locking the device. */
|
||||||
|
boolean isFrpActive();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface to provide calls when the values tracked change
|
* Interface to provide calls when the values tracked change
|
||||||
*/
|
*/
|
||||||
@@ -69,5 +73,10 @@ public interface DeviceProvisionedController extends CallbackController<DevicePr
|
|||||||
* Call when some user changes from not provisioned to provisioned
|
* Call when some user changes from not provisioned to provisioned
|
||||||
*/
|
*/
|
||||||
default void onUserSetupChanged() { }
|
default void onUserSetupChanged() { }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the state of FRP changes.
|
||||||
|
*/
|
||||||
|
default void onFrpActiveChanged() {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,9 +60,11 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val deviceProvisionedUri = globalSettings.getUriFor(Settings.Global.DEVICE_PROVISIONED)
|
private val deviceProvisionedUri = globalSettings.getUriFor(Settings.Global.DEVICE_PROVISIONED)
|
||||||
|
private val frpActiveUri = secureSettings.getUriFor(Settings.Secure.SECURE_FRP_MODE)
|
||||||
private val userSetupUri = secureSettings.getUriFor(Settings.Secure.USER_SETUP_COMPLETE)
|
private val userSetupUri = secureSettings.getUriFor(Settings.Secure.USER_SETUP_COMPLETE)
|
||||||
|
|
||||||
private val deviceProvisioned = AtomicBoolean(false)
|
private val deviceProvisioned = AtomicBoolean(false)
|
||||||
|
private val frpActive = AtomicBoolean(false)
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
private val userSetupComplete = SparseBooleanArray()
|
private val userSetupComplete = SparseBooleanArray()
|
||||||
@GuardedBy("lock")
|
@GuardedBy("lock")
|
||||||
@@ -89,11 +91,15 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
userId: Int
|
userId: Int
|
||||||
) {
|
) {
|
||||||
val updateDeviceProvisioned = deviceProvisionedUri in uris
|
val updateDeviceProvisioned = deviceProvisionedUri in uris
|
||||||
|
val updateFrp = frpActiveUri in uris
|
||||||
val updateUser = if (userSetupUri in uris) userId else NO_USERS
|
val updateUser = if (userSetupUri in uris) userId else NO_USERS
|
||||||
updateValues(updateDeviceProvisioned, updateUser)
|
updateValues(updateDeviceProvisioned, updateFrp, updateUser)
|
||||||
if (updateDeviceProvisioned) {
|
if (updateDeviceProvisioned) {
|
||||||
onDeviceProvisionedChanged()
|
onDeviceProvisionedChanged()
|
||||||
}
|
}
|
||||||
|
if (updateFrp) {
|
||||||
|
onFrpActiveChanged()
|
||||||
|
}
|
||||||
if (updateUser != NO_USERS) {
|
if (updateUser != NO_USERS) {
|
||||||
onUserSetupChanged()
|
onUserSetupChanged()
|
||||||
}
|
}
|
||||||
@@ -103,7 +109,7 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
private val userChangedCallback = object : UserTracker.Callback {
|
private val userChangedCallback = object : UserTracker.Callback {
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
override fun onUserChanged(newUser: Int, userContext: Context) {
|
override fun onUserChanged(newUser: Int, userContext: Context) {
|
||||||
updateValues(updateDeviceProvisioned = false, updateUser = newUser)
|
updateValues(updateDeviceProvisioned = false, updateFrp = false, updateUser = newUser)
|
||||||
onUserSwitched()
|
onUserSwitched()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,19 +131,27 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
updateValues()
|
updateValues()
|
||||||
userTracker.addCallback(userChangedCallback, backgroundExecutor)
|
userTracker.addCallback(userChangedCallback, backgroundExecutor)
|
||||||
globalSettings.registerContentObserver(deviceProvisionedUri, observer)
|
globalSettings.registerContentObserver(deviceProvisionedUri, observer)
|
||||||
|
globalSettings.registerContentObserver(frpActiveUri, observer)
|
||||||
secureSettings.registerContentObserverForUser(userSetupUri, observer, UserHandle.USER_ALL)
|
secureSettings.registerContentObserverForUser(userSetupUri, observer, UserHandle.USER_ALL)
|
||||||
}
|
}
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
private fun updateValues(updateDeviceProvisioned: Boolean = true, updateUser: Int = ALL_USERS) {
|
private fun updateValues(
|
||||||
|
updateDeviceProvisioned: Boolean = true,
|
||||||
|
updateFrp: Boolean = true,
|
||||||
|
updateUser: Int = ALL_USERS
|
||||||
|
) {
|
||||||
if (updateDeviceProvisioned) {
|
if (updateDeviceProvisioned) {
|
||||||
deviceProvisioned
|
deviceProvisioned
|
||||||
.set(globalSettings.getInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0)
|
.set(globalSettings.getInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0)
|
||||||
}
|
}
|
||||||
|
if (updateFrp) {
|
||||||
|
frpActive.set(globalSettings.getInt(Settings.Secure.SECURE_FRP_MODE, 0) != 0)
|
||||||
|
}
|
||||||
synchronized(lock) {
|
synchronized(lock) {
|
||||||
if (updateUser == ALL_USERS) {
|
if (updateUser == ALL_USERS) {
|
||||||
val N = userSetupComplete.size()
|
val n = userSetupComplete.size()
|
||||||
for (i in 0 until N) {
|
for (i in 0 until n) {
|
||||||
val user = userSetupComplete.keyAt(i)
|
val user = userSetupComplete.keyAt(i)
|
||||||
val value = secureSettings
|
val value = secureSettings
|
||||||
.getIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0, user) != 0
|
.getIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0, user) != 0
|
||||||
@@ -172,6 +186,10 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
return deviceProvisioned.get()
|
return deviceProvisioned.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun isFrpActive(): Boolean {
|
||||||
|
return frpActive.get()
|
||||||
|
}
|
||||||
|
|
||||||
override fun isUserSetup(user: Int): Boolean {
|
override fun isUserSetup(user: Int): Boolean {
|
||||||
val index = synchronized(lock) {
|
val index = synchronized(lock) {
|
||||||
userSetupComplete.indexOfKey(user)
|
userSetupComplete.indexOfKey(user)
|
||||||
@@ -200,6 +218,12 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onFrpActiveChanged() {
|
||||||
|
dispatchChange(
|
||||||
|
DeviceProvisionedController.DeviceProvisionedListener::onFrpActiveChanged
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onUserSetupChanged() {
|
override fun onUserSetupChanged() {
|
||||||
dispatchChange(DeviceProvisionedController.DeviceProvisionedListener::onUserSetupChanged)
|
dispatchChange(DeviceProvisionedController.DeviceProvisionedListener::onUserSetupChanged)
|
||||||
}
|
}
|
||||||
@@ -221,6 +245,7 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
|||||||
|
|
||||||
override fun dump(pw: PrintWriter, args: Array<out String>) {
|
override fun dump(pw: PrintWriter, args: Array<out String>) {
|
||||||
pw.println("Device provisioned: ${deviceProvisioned.get()}")
|
pw.println("Device provisioned: ${deviceProvisioned.get()}")
|
||||||
|
pw.println("Factory Reset Protection active: ${frpActive.get()}")
|
||||||
synchronized(lock) {
|
synchronized(lock) {
|
||||||
pw.println("User setup complete: $userSetupComplete")
|
pw.println("User setup complete: $userSetupComplete")
|
||||||
pw.println("Listeners: $listeners")
|
pw.println("Listeners: $listeners")
|
||||||
|
|||||||
@@ -1259,6 +1259,15 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
|
|||||||
verify(mPowerManagerService, never()).wakeUp(anyLong(), anyInt(), anyString(), anyString());
|
verify(mPowerManagerService, never()).wakeUp(anyLong(), anyInt(), anyString(), anyString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void frpLockedDevice_shadeDisabled() {
|
||||||
|
when(mDeviceProvisionedController.isFrpActive()).thenReturn(true);
|
||||||
|
when(mDozeServiceHost.isPulsing()).thenReturn(true);
|
||||||
|
mCentralSurfaces.updateNotificationPanelTouchState();
|
||||||
|
|
||||||
|
verify(mNotificationPanelViewController).setTouchAndAnimationDisabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the appropriate mocks and then calls {@link CentralSurfacesImpl#updateIsKeyguard}
|
* Configures the appropriate mocks and then calls {@link CentralSurfacesImpl#updateIsKeyguard}
|
||||||
* to reconfigure the keyguard to reflect the requested showing/occluded states.
|
* to reconfigure the keyguard to reflect the requested showing/occluded states.
|
||||||
|
|||||||
@@ -89,6 +89,12 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
assertThat(controller.isDeviceProvisioned).isFalse()
|
assertThat(controller.isDeviceProvisioned).isFalse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testFrpNotActiveByDefault() {
|
||||||
|
init()
|
||||||
|
assertThat(controller.isFrpActive).isFalse()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testNotUserSetupByDefault() {
|
fun testNotUserSetupByDefault() {
|
||||||
init()
|
init()
|
||||||
@@ -103,6 +109,14 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
assertThat(controller.isDeviceProvisioned).isTrue()
|
assertThat(controller.isDeviceProvisioned).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testFrpActiveWhenCreated() {
|
||||||
|
settings.putInt(Settings.Secure.SECURE_FRP_MODE, 1)
|
||||||
|
init()
|
||||||
|
|
||||||
|
assertThat(controller.isFrpActive).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testUserSetupWhenCreated() {
|
fun testUserSetupWhenCreated() {
|
||||||
settings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
|
settings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
|
||||||
@@ -121,6 +135,16 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
assertThat(controller.isDeviceProvisioned).isTrue()
|
assertThat(controller.isDeviceProvisioned).isTrue()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testFrpActiveChange() {
|
||||||
|
init()
|
||||||
|
|
||||||
|
settings.putInt(Settings.Secure.SECURE_FRP_MODE, 1)
|
||||||
|
testableLooper.processAllMessages() // background observer
|
||||||
|
|
||||||
|
assertThat(controller.isFrpActive).isTrue()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testUserSetupChange() {
|
fun testUserSetupChange() {
|
||||||
init()
|
init()
|
||||||
@@ -164,6 +188,7 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
mainExecutor.runAllReady()
|
mainExecutor.runAllReady()
|
||||||
|
|
||||||
verify(listener, never()).onDeviceProvisionedChanged()
|
verify(listener, never()).onDeviceProvisionedChanged()
|
||||||
|
verify(listener, never()).onFrpActiveChanged()
|
||||||
verify(listener, never()).onUserSetupChanged()
|
verify(listener, never()).onUserSetupChanged()
|
||||||
verify(listener, never()).onUserSwitched()
|
verify(listener, never()).onUserSwitched()
|
||||||
}
|
}
|
||||||
@@ -181,6 +206,7 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
verify(listener).onUserSwitched()
|
verify(listener).onUserSwitched()
|
||||||
verify(listener, never()).onUserSetupChanged()
|
verify(listener, never()).onUserSetupChanged()
|
||||||
verify(listener, never()).onDeviceProvisionedChanged()
|
verify(listener, never()).onDeviceProvisionedChanged()
|
||||||
|
verify(listener, never()).onFrpActiveChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -195,6 +221,7 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
verify(listener, never()).onUserSwitched()
|
verify(listener, never()).onUserSwitched()
|
||||||
verify(listener).onUserSetupChanged()
|
verify(listener).onUserSetupChanged()
|
||||||
verify(listener, never()).onDeviceProvisionedChanged()
|
verify(listener, never()).onDeviceProvisionedChanged()
|
||||||
|
verify(listener, never()).onFrpActiveChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -208,9 +235,25 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
|
|
||||||
verify(listener, never()).onUserSwitched()
|
verify(listener, never()).onUserSwitched()
|
||||||
verify(listener, never()).onUserSetupChanged()
|
verify(listener, never()).onUserSetupChanged()
|
||||||
|
verify(listener, never()).onFrpActiveChanged()
|
||||||
verify(listener).onDeviceProvisionedChanged()
|
verify(listener).onDeviceProvisionedChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testListenerCalledOnFrpActiveChanged() {
|
||||||
|
init()
|
||||||
|
controller.addCallback(listener)
|
||||||
|
|
||||||
|
settings.putInt(Settings.Secure.SECURE_FRP_MODE, 1)
|
||||||
|
testableLooper.processAllMessages()
|
||||||
|
mainExecutor.runAllReady()
|
||||||
|
|
||||||
|
verify(listener, never()).onUserSwitched()
|
||||||
|
verify(listener, never()).onUserSetupChanged()
|
||||||
|
verify(listener, never()).onDeviceProvisionedChanged()
|
||||||
|
verify(listener).onFrpActiveChanged()
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testRemoveListener() {
|
fun testRemoveListener() {
|
||||||
init()
|
init()
|
||||||
@@ -220,11 +263,13 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
|||||||
switchUser(10)
|
switchUser(10)
|
||||||
settings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
|
settings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
|
||||||
settings.putInt(Settings.Global.DEVICE_PROVISIONED, 1)
|
settings.putInt(Settings.Global.DEVICE_PROVISIONED, 1)
|
||||||
|
settings.putInt(Settings.Secure.SECURE_FRP_MODE, 1)
|
||||||
|
|
||||||
testableLooper.processAllMessages()
|
testableLooper.processAllMessages()
|
||||||
mainExecutor.runAllReady()
|
mainExecutor.runAllReady()
|
||||||
|
|
||||||
verify(listener, never()).onDeviceProvisionedChanged()
|
verify(listener, never()).onDeviceProvisionedChanged()
|
||||||
|
verify(listener, never()).onFrpActiveChanged()
|
||||||
verify(listener, never()).onUserSetupChanged()
|
verify(listener, never()).onUserSetupChanged()
|
||||||
verify(listener, never()).onUserSwitched()
|
verify(listener, never()).onUserSwitched()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user