Add FRP setting to DeviceProvisionController

Bug: 267313135
Test: unit tests
Change-Id: Ifbb9dfe3539486688e0f42e4e8ff424e62d4d415
This commit is contained in:
Justin Weir
2023-03-07 16:35:32 -05:00
parent a23734e2b6
commit 5994af686b
3 changed files with 86 additions and 7 deletions

View File

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

View File

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

View File

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