From a5e96401e49a0d2df7a0177ba1b143d13e19508c Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Mon, 25 Jul 2022 10:56:34 -0700 Subject: [PATCH] [UserFileManager] Ensure parent exists. Ensure that parent file exists for files being pulled from UserFileManager. Bug: 227776912 Test: Added a unit test, and tested on device Change-Id: Idb5d3bd61b5d82c5526c22c82957a4d3a8b30f1a --- .../systemui/settings/UserFileManagerImpl.kt | 23 ++++++++++-- .../settings/UserFileManagerImplTest.kt | 37 ++++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserFileManagerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserFileManagerImpl.kt index 8c8f54fe9c3d6..ad073c073ed8d 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserFileManagerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserFileManagerImpl.kt @@ -49,8 +49,8 @@ class UserFileManagerImpl @Inject constructor( ) : UserFileManager, CoreStartable(context) { companion object { private const val FILES = "files" - private const val SHARED_PREFS = "shared_prefs" - internal const val ID = "UserFileManager" + @VisibleForTesting internal const val SHARED_PREFS = "shared_prefs" + @VisibleForTesting internal const val ID = "UserFileManager" } private val broadcastReceiver = object : BroadcastReceiver() { @@ -85,13 +85,15 @@ class UserFileManagerImpl @Inject constructor( fileName ) } else { - Environment.buildPath( + val secondaryFile = Environment.buildPath( context.filesDir, ID, userId.toString(), FILES, fileName ) + ensureParentDirExists(secondaryFile) + secondaryFile } } @@ -114,6 +116,7 @@ class UserFileManagerImpl @Inject constructor( fileName ) + ensureParentDirExists(secondaryUserDir) return context.getSharedPreferences(secondaryUserDir, mode) } @@ -141,4 +144,18 @@ class UserFileManagerImpl @Inject constructor( } } } + + /** + * Checks to see if parent dir of the file exists. If it does not, we create the parent dirs + * recursively. + */ + @VisibleForTesting + internal fun ensureParentDirExists(file: File) { + val parent = file.parentFile + if (!parent.exists()) { + if (!parent.mkdirs()) { + Log.e(ID, "Could not create parent directory for file: ${file.absolutePath}") + } + } + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/UserFileManagerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/UserFileManagerImplTest.kt index 73226fa0b12cf..6d9b01e28aa43 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/UserFileManagerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/UserFileManagerImplTest.kt @@ -31,6 +31,7 @@ import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import java.util.concurrent.Executor +import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -62,6 +63,14 @@ class UserFileManagerImplTest : SysuiTestCase() { broadcastDispatcher, backgroundExecutor) } + @After + fun end() { + val dir = Environment.buildPath( + context.filesDir, + UserFileManagerImpl.ID) + dir.deleteRecursively() + } + @Test fun testGetFile() { assertThat(userFileManager.getFile(TEST_FILE_NAME, 0).path) @@ -72,8 +81,19 @@ class UserFileManagerImplTest : SysuiTestCase() { @Test fun testGetSharedPreferences() { + val secondarySharedPref = userFileManager.getSharedPreferences(TEST_FILE_NAME, 0, 11) + val secondaryUserDir = Environment.buildPath( + context.filesDir, + UserFileManagerImpl.ID, + "11", + UserFileManagerImpl.SHARED_PREFS, + TEST_FILE_NAME + ) + + assertThat(secondarySharedPref).isNotNull() + assertThat(secondaryUserDir.exists()) assertThat(userFileManager.getSharedPreferences(TEST_FILE_NAME, 0, 0)) - .isNotEqualTo(userFileManager.getSharedPreferences(TEST_FILE_NAME, 0, 11)) + .isNotEqualTo(secondarySharedPref) } @Test @@ -115,6 +135,19 @@ class UserFileManagerImplTest : SysuiTestCase() { verify(userManager).aliveUsers assertThat(secondaryUserDir.exists()).isFalse() assertThat(file.exists()).isFalse() - dir.deleteRecursively() + } + + @Test + fun testEnsureParentDirExists() { + val file = Environment.buildPath( + context.filesDir, + UserFileManagerImpl.ID, + "11", + "files", + TEST_FILE_NAME + ) + assertThat(file.parentFile.exists()).isFalse() + userFileManager.ensureParentDirExists(file) + assertThat(file.parentFile.exists()).isTrue() } }