diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt index bed553e6e4d69..50ce9d4ec0f4d 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt @@ -20,13 +20,11 @@ import android.app.PendingIntent import android.app.backup.BackupManager import android.content.BroadcastReceiver import android.content.ComponentName -import android.content.ContentResolver import android.content.Context import android.content.Intent import android.content.IntentFilter import android.database.ContentObserver import android.net.Uri -import android.os.Environment import android.os.UserHandle import android.service.controls.Control import android.service.controls.actions.ControlAction @@ -43,6 +41,7 @@ import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dump.DumpManager +import com.android.systemui.settings.UserFileManager import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.PREFS_CONTROLS_FILE import com.android.systemui.statusbar.policy.DeviceControlsControllerImpl.Companion.PREFS_CONTROLS_SEEDING_COMPLETED @@ -61,6 +60,7 @@ class ControlsControllerImpl @Inject constructor ( private val bindingController: ControlsBindingController, private val listingController: ControlsListingController, private val broadcastDispatcher: BroadcastDispatcher, + private val userFileManager: UserFileManager, optionalWrapper: Optional, dumpManager: DumpManager, userTracker: UserTracker @@ -84,15 +84,12 @@ class ControlsControllerImpl @Inject constructor ( override val currentUserId get() = currentUser.identifier - private val contentResolver: ContentResolver - get() = context.contentResolver - private val persistenceWrapper: ControlsFavoritePersistenceWrapper @VisibleForTesting internal var auxiliaryPersistenceWrapper: AuxiliaryPersistenceWrapper init { - userStructure = UserStructure(context, currentUser) + userStructure = UserStructure(context, currentUser, userFileManager) persistenceWrapper = optionalWrapper.orElseGet { ControlsFavoritePersistenceWrapper( @@ -111,7 +108,7 @@ class ControlsControllerImpl @Inject constructor ( private fun setValuesForUser(newUser: UserHandle) { Log.d(TAG, "Changing to user: $newUser") currentUser = newUser - userStructure = UserStructure(context, currentUser) + userStructure = UserStructure(context, currentUser, userFileManager) persistenceWrapper.changeFileAndBackupManager( userStructure.file, BackupManager(userStructure.userContext) @@ -187,8 +184,11 @@ class ControlsControllerImpl @Inject constructor ( // When a component is uninstalled, allow seeding to happen again if the user // reinstalls the app - val prefs = userStructure.userContext.getSharedPreferences( - PREFS_CONTROLS_FILE, Context.MODE_PRIVATE) + val prefs = userFileManager.getSharedPreferences( + PREFS_CONTROLS_FILE, + Context.MODE_PRIVATE, + userTracker.userId + ) val completedSeedingPackageSet = prefs.getStringSet( PREFS_CONTROLS_SEEDING_COMPLETED, mutableSetOf()) val servicePackageSet = serviceInfoSet.map { it.packageName } @@ -575,18 +575,12 @@ class ControlsControllerImpl @Inject constructor ( } } -class UserStructure(context: Context, user: UserHandle) { +class UserStructure(context: Context, user: UserHandle, userFileManager: UserFileManager) { val userContext = context.createContextAsUser(user, 0) - - val file = Environment.buildPath( - userContext.filesDir, - ControlsFavoritePersistenceWrapper.FILE_NAME - ) - - val auxiliaryFile = Environment.buildPath( - userContext.filesDir, - AuxiliaryPersistenceWrapper.AUXILIARY_FILE_NAME - ) + val file = userFileManager.getFile(ControlsFavoritePersistenceWrapper.FILE_NAME, + user.identifier) + val auxiliaryFile = userFileManager.getFile(AuxiliaryPersistenceWrapper.AUXILIARY_FILE_NAME, + user.identifier) } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt index 3c7ea4fe6f356..c31fd828c730e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsControllerImplTest.kt @@ -37,9 +37,14 @@ import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.management.ControlsListingController import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dump.DumpManager +import com.android.systemui.settings.UserFileManager import com.android.systemui.settings.UserTracker import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat +import java.io.File +import java.util.Optional +import java.util.function.Consumer import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse @@ -50,20 +55,20 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor import org.mockito.ArgumentMatchers +import org.mockito.ArgumentMatchers.anyString import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito import org.mockito.Mockito.anyInt -import org.mockito.Mockito.`when` import org.mockito.Mockito.inOrder import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.reset +import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions +import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations -import java.util.Optional -import java.util.function.Consumer @SmallTest @RunWith(AndroidTestingRunner::class) @@ -85,6 +90,8 @@ class ControlsControllerImplTest : SysuiTestCase() { private lateinit var listingController: ControlsListingController @Mock(stubOnly = true) private lateinit var userTracker: UserTracker + @Mock + private lateinit var userFileManager: UserFileManager @Captor private lateinit var structureInfoCaptor: ArgumentCaptor @@ -153,6 +160,9 @@ class ControlsControllerImplTest : SysuiTestCase() { canceller = DidRunRunnable() `when`(bindingController.bindAndLoad(any(), any())).thenReturn(canceller) + `when`(userFileManager.getFile(anyString(), anyInt())).thenReturn(mock(File::class.java)) + `when`(userFileManager.getSharedPreferences(anyString(), anyInt(), anyInt())) + .thenReturn(context.getSharedPreferences("test", Context.MODE_PRIVATE)) controller = ControlsControllerImpl( wrapper, @@ -161,6 +171,7 @@ class ControlsControllerImplTest : SysuiTestCase() { bindingController, listingController, broadcastDispatcher, + userFileManager, Optional.of(persistenceWrapper), mock(DumpManager::class.java), userTracker @@ -217,6 +228,7 @@ class ControlsControllerImplTest : SysuiTestCase() { bindingController, listingController, broadcastDispatcher, + userFileManager, Optional.of(persistenceWrapper), mock(DumpManager::class.java), userTracker @@ -911,6 +923,14 @@ class ControlsControllerImplTest : SysuiTestCase() { assertTrue(controller.getFavoritesForStructure(TEST_COMPONENT_2, TEST_STRUCTURE).isEmpty()) } + + @Test + fun testUserStructure() { + val userStructure = UserStructure(context, context.user, userFileManager) + verify(userFileManager, times(2)) + .getFile(ControlsFavoritePersistenceWrapper.FILE_NAME, context.user.identifier) + assertThat(userStructure.file).isNotNull() + } } private class DidRunRunnable() : Runnable {