[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
This commit is contained in:
Aaron Liu
2022-07-25 10:56:34 -07:00
parent 0b0822b3c5
commit a5e96401e4
2 changed files with 55 additions and 5 deletions

View File

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

View File

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