committed by
bunnei
2 changed files with 66 additions and 72 deletions
-
72src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.java
-
66src/android/app/src/main/java/org/yuzu/yuzu_emu/utils/DirectoryInitialization.kt
@ -1,72 +0,0 @@ |
|||||
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; |
|
||||
|
|
||||
public final class DirectoryInitialization { |
|
||||
public static final String BROADCAST_ACTION = "org.yuzu.yuzu_emu.BROADCAST"; |
|
||||
public static final String EXTRA_STATE = "directoryState"; |
|
||||
private static volatile DirectoryInitializationState directoryState = null; |
|
||||
private static String userPath; |
|
||||
private static AtomicBoolean isDirectoryInitializationRunning = new AtomicBoolean(false); |
|
||||
|
|
||||
public static void start(Context context) { |
|
||||
// Can take a few seconds to run, so don't block UI thread. |
|
||||
((Runnable) () -> init(context)).run(); |
|
||||
} |
|
||||
|
|
||||
private static void 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); |
|
||||
} |
|
||||
|
|
||||
public static boolean areDirectoriesReady() { |
|
||||
return directoryState == DirectoryInitializationState.YUZU_DIRECTORIES_INITIALIZED; |
|
||||
} |
|
||||
|
|
||||
public static String getUserDirectory() { |
|
||||
if (directoryState == null) { |
|
||||
throw new IllegalStateException("DirectoryInitialization has to run at least once!"); |
|
||||
} else if (isDirectoryInitializationRunning.get()) { |
|
||||
throw new IllegalStateException( |
|
||||
"DirectoryInitialization has to finish running first!"); |
|
||||
} |
|
||||
return userPath; |
|
||||
} |
|
||||
|
|
||||
public static void initializeInternalStorage(Context context) { |
|
||||
try { |
|
||||
userPath = context.getExternalFilesDir(null).getCanonicalPath(); |
|
||||
NativeLibrary.SetAppDirectory(userPath); |
|
||||
} catch(IOException e) { |
|
||||
e.printStackTrace(); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private static void sendBroadcastState(DirectoryInitializationState state, Context context) { |
|
||||
Intent localIntent = |
|
||||
new Intent(BROADCAST_ACTION) |
|
||||
.putExtra(EXTRA_STATE, state); |
|
||||
LocalBroadcastManager.getInstance(context).sendBroadcast(localIntent); |
|
||||
} |
|
||||
|
|
||||
public enum DirectoryInitializationState { |
|
||||
YUZU_DIRECTORIES_INITIALIZED, |
|
||||
CANT_FIND_EXTERNAL_STORAGE |
|
||||
} |
|
||||
} |
|
||||
@ -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 |
||||
|
} |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue