Add FRP setting to DeviceProvisionController
Bug: 267313135 Test: unit tests Change-Id: Ifbb9dfe3539486688e0f42e4e8ff424e62d4d415
This commit is contained in:
@@ -21,7 +21,8 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController.DeviceP
|
||||
/**
|
||||
* Controller to cache in process the state of the device provisioning.
|
||||
* <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> {
|
||||
|
||||
@@ -49,6 +50,9 @@ public interface DeviceProvisionedController extends CallbackController<DevicePr
|
||||
*/
|
||||
boolean isCurrentUserSetup();
|
||||
|
||||
/** Returns true when Factory Reset Protection is locking the device. */
|
||||
boolean isFrpActive();
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
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 frpActiveUri = secureSettings.getUriFor(Settings.Secure.SECURE_FRP_MODE)
|
||||
private val userSetupUri = secureSettings.getUriFor(Settings.Secure.USER_SETUP_COMPLETE)
|
||||
|
||||
private val deviceProvisioned = AtomicBoolean(false)
|
||||
private val frpActive = AtomicBoolean(false)
|
||||
@GuardedBy("lock")
|
||||
private val userSetupComplete = SparseBooleanArray()
|
||||
@GuardedBy("lock")
|
||||
@@ -89,11 +91,15 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
||||
userId: Int
|
||||
) {
|
||||
val updateDeviceProvisioned = deviceProvisionedUri in uris
|
||||
val updateFrp = frpActiveUri in uris
|
||||
val updateUser = if (userSetupUri in uris) userId else NO_USERS
|
||||
updateValues(updateDeviceProvisioned, updateUser)
|
||||
updateValues(updateDeviceProvisioned, updateFrp, updateUser)
|
||||
if (updateDeviceProvisioned) {
|
||||
onDeviceProvisionedChanged()
|
||||
}
|
||||
if (updateFrp) {
|
||||
onFrpActiveChanged()
|
||||
}
|
||||
if (updateUser != NO_USERS) {
|
||||
onUserSetupChanged()
|
||||
}
|
||||
@@ -103,7 +109,7 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
||||
private val userChangedCallback = object : UserTracker.Callback {
|
||||
@WorkerThread
|
||||
override fun onUserChanged(newUser: Int, userContext: Context) {
|
||||
updateValues(updateDeviceProvisioned = false, updateUser = newUser)
|
||||
updateValues(updateDeviceProvisioned = false, updateFrp = false, updateUser = newUser)
|
||||
onUserSwitched()
|
||||
}
|
||||
|
||||
@@ -125,19 +131,27 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
||||
updateValues()
|
||||
userTracker.addCallback(userChangedCallback, backgroundExecutor)
|
||||
globalSettings.registerContentObserver(deviceProvisionedUri, observer)
|
||||
globalSettings.registerContentObserver(frpActiveUri, observer)
|
||||
secureSettings.registerContentObserverForUser(userSetupUri, observer, UserHandle.USER_ALL)
|
||||
}
|
||||
|
||||
@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) {
|
||||
deviceProvisioned
|
||||
.set(globalSettings.getInt(Settings.Global.DEVICE_PROVISIONED, 0) != 0)
|
||||
}
|
||||
if (updateFrp) {
|
||||
frpActive.set(globalSettings.getInt(Settings.Secure.SECURE_FRP_MODE, 0) != 0)
|
||||
}
|
||||
synchronized(lock) {
|
||||
if (updateUser == ALL_USERS) {
|
||||
val N = userSetupComplete.size()
|
||||
for (i in 0 until N) {
|
||||
val n = userSetupComplete.size()
|
||||
for (i in 0 until n) {
|
||||
val user = userSetupComplete.keyAt(i)
|
||||
val value = secureSettings
|
||||
.getIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 0, user) != 0
|
||||
@@ -172,6 +186,10 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
||||
return deviceProvisioned.get()
|
||||
}
|
||||
|
||||
override fun isFrpActive(): Boolean {
|
||||
return frpActive.get()
|
||||
}
|
||||
|
||||
override fun isUserSetup(user: Int): Boolean {
|
||||
val index = synchronized(lock) {
|
||||
userSetupComplete.indexOfKey(user)
|
||||
@@ -196,7 +214,13 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
||||
|
||||
override fun onDeviceProvisionedChanged() {
|
||||
dispatchChange(
|
||||
DeviceProvisionedController.DeviceProvisionedListener::onDeviceProvisionedChanged
|
||||
DeviceProvisionedController.DeviceProvisionedListener::onDeviceProvisionedChanged
|
||||
)
|
||||
}
|
||||
|
||||
override fun onFrpActiveChanged() {
|
||||
dispatchChange(
|
||||
DeviceProvisionedController.DeviceProvisionedListener::onFrpActiveChanged
|
||||
)
|
||||
}
|
||||
|
||||
@@ -221,6 +245,7 @@ open class DeviceProvisionedControllerImpl @Inject constructor(
|
||||
|
||||
override fun dump(pw: PrintWriter, args: Array<out String>) {
|
||||
pw.println("Device provisioned: ${deviceProvisioned.get()}")
|
||||
pw.println("Factory Reset Protection active: ${frpActive.get()}")
|
||||
synchronized(lock) {
|
||||
pw.println("User setup complete: $userSetupComplete")
|
||||
pw.println("Listeners: $listeners")
|
||||
|
||||
@@ -89,6 +89,12 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
assertThat(controller.isDeviceProvisioned).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFrpNotActiveByDefault() {
|
||||
init()
|
||||
assertThat(controller.isFrpActive).isFalse()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testNotUserSetupByDefault() {
|
||||
init()
|
||||
@@ -103,6 +109,14 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
assertThat(controller.isDeviceProvisioned).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testFrpActiveWhenCreated() {
|
||||
settings.putInt(Settings.Secure.SECURE_FRP_MODE, 1)
|
||||
init()
|
||||
|
||||
assertThat(controller.isFrpActive).isTrue()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testUserSetupWhenCreated() {
|
||||
settings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
|
||||
@@ -121,6 +135,16 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
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
|
||||
fun testUserSetupChange() {
|
||||
init()
|
||||
@@ -164,6 +188,7 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
mainExecutor.runAllReady()
|
||||
|
||||
verify(listener, never()).onDeviceProvisionedChanged()
|
||||
verify(listener, never()).onFrpActiveChanged()
|
||||
verify(listener, never()).onUserSetupChanged()
|
||||
verify(listener, never()).onUserSwitched()
|
||||
}
|
||||
@@ -181,6 +206,7 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
verify(listener).onUserSwitched()
|
||||
verify(listener, never()).onUserSetupChanged()
|
||||
verify(listener, never()).onDeviceProvisionedChanged()
|
||||
verify(listener, never()).onFrpActiveChanged()
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -195,6 +221,7 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
verify(listener, never()).onUserSwitched()
|
||||
verify(listener).onUserSetupChanged()
|
||||
verify(listener, never()).onDeviceProvisionedChanged()
|
||||
verify(listener, never()).onFrpActiveChanged()
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -208,9 +235,25 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
|
||||
verify(listener, never()).onUserSwitched()
|
||||
verify(listener, never()).onUserSetupChanged()
|
||||
verify(listener, never()).onFrpActiveChanged()
|
||||
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
|
||||
fun testRemoveListener() {
|
||||
init()
|
||||
@@ -220,11 +263,13 @@ class DeviceProvisionedControllerImplTest : SysuiTestCase() {
|
||||
switchUser(10)
|
||||
settings.putIntForUser(Settings.Secure.USER_SETUP_COMPLETE, 1, START_USER)
|
||||
settings.putInt(Settings.Global.DEVICE_PROVISIONED, 1)
|
||||
settings.putInt(Settings.Secure.SECURE_FRP_MODE, 1)
|
||||
|
||||
testableLooper.processAllMessages()
|
||||
mainExecutor.runAllReady()
|
||||
|
||||
verify(listener, never()).onDeviceProvisionedChanged()
|
||||
verify(listener, never()).onFrpActiveChanged()
|
||||
verify(listener, never()).onUserSetupChanged()
|
||||
verify(listener, never()).onUserSwitched()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user