summaryrefslogtreecommitdiffstats
path: root/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt')
-rw-r--r--src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
new file mode 100644
index 000000000..5016f7d6e
--- /dev/null
+++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
@@ -0,0 +1,66 @@
+package org.yuzu.yuzu_emu.utils
+
+import android.content.Context
+import android.content.Intent
+import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import org.yuzu.yuzu_emu.NativeLibrary
+import java.io.IOException
+import java.util.concurrent.atomic.AtomicBoolean
+
+object DirectoryInitialization {
+ const val BROADCAST_ACTION = "org.yuzu.yuzu_emu.BROADCAST"
+ const val EXTRA_STATE = "directoryState"
+
+ @Volatile
+ private var directoryState: DirectoryInitializationState? = null
+ private var userPath: String? = null
+ private val isDirectoryInitializationRunning = AtomicBoolean(false)
+
+ @JvmStatic
+ fun start(context: Context) {
+ // Can take a few seconds to run, so don't block UI thread.
+ Runnable { init(context) }.run()
+ }
+
+ private fun init(context: Context) {
+ if (!isDirectoryInitializationRunning.compareAndSet(false, true)) return
+ if (directoryState != DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED) {
+ initializeInternalStorage(context)
+ NativeLibrary.InitializeEmulation()
+ directoryState = DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED
+ }
+ isDirectoryInitializationRunning.set(false)
+ sendBroadcastState(directoryState, context)
+ }
+
+ fun areDirectoriesReady(): Boolean {
+ return directoryState == DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED
+ }
+
+ val userDirectory: String?
+ get() {
+ checkNotNull(directoryState) { "DirectoryInitialization has to run at least once!" }
+ check(!isDirectoryInitializationRunning.get()) { "DirectoryInitialization has to finish running first!" }
+ return userPath
+ }
+
+ private fun initializeInternalStorage(context: Context) {
+ try {
+ userPath = context.getExternalFilesDir(null)!!.canonicalPath
+ NativeLibrary.SetAppDirectory(userPath)
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+ private fun sendBroadcastState(state: DirectoryInitializationState?, context: Context) {
+ val localIntent = Intent(BROADCAST_ACTION)
+ .putExtra(EXTRA_STATE, state)
+ LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent)
+ }
+
+ enum class DirectoryInitializationState {
+ YUZU_DIRECTORIES_INITIALIZED,
+ CANT_FIND_EXTERNAL_STORAGE
+ }
+}