diff --git a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt index 13df3df88..3e82567f1 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/NativeLibrary.kt @@ -703,7 +703,7 @@ object NativeLibrary { if (pathSegment.startsWith("primary:")) { // User directory is located in primary storage val primaryStoragePath = Environment.getExternalStorageDirectory().absolutePath - return primaryStoragePath + dirSep + virtualPath + dirSep + return primaryStoragePath + dirSep + virtualPath } else { // User directory probably located on a removable storage device val storageIdString = pathSegment.substringBefore(":") val removablePath = RemovableStorageHelper.getRemovableStoragePath(storageIdString) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/utils/CiaInstallWorker.kt b/src/android/app/src/main/java/org/citra/citra_emu/utils/CiaInstallWorker.kt index dfb10d310..5dd7821f8 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/utils/CiaInstallWorker.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/utils/CiaInstallWorker.kt @@ -1,4 +1,4 @@ -// Copyright 2023 Citra Emulator Project +// Copyright Citra Emulator Project / Azahar Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. @@ -12,9 +12,11 @@ import androidx.core.app.NotificationCompat import androidx.work.ForegroundInfo import androidx.work.Worker import androidx.work.WorkerParameters +import org.citra.citra_emu.NativeLibrary import org.citra.citra_emu.NativeLibrary.InstallStatus import org.citra.citra_emu.R import org.citra.citra_emu.utils.FileUtil.getFilename +import androidx.core.net.toUri class CiaInstallWorker( val context: Context, @@ -131,7 +133,7 @@ class CiaInstallWorker( installProgressBuilder.setOngoing(true) setProgressCallback(100, 0) selectedFiles.forEachIndexed { i, file -> - val filename = getFilename(Uri.parse(file)) + val filename = getFilename(file.toUri()) installProgressBuilder.setContentText( context.getString( R.string.cia_install_notification_installing, @@ -140,7 +142,13 @@ class CiaInstallWorker( selectedFiles.size ) ) - val res = installCIA(file) + var fileFinal: String + if (BuildUtil.isGooglePlayBuild) { + fileFinal = file + } else { + fileFinal = "!" + NativeLibrary.getNativePath(file.toUri()) + } + val res = installCIA(fileFinal) notifyInstallStatus(filename, res) } notificationManager.cancel(PROGRESS_NOTIFICATION_ID) diff --git a/src/common/android_storage.cpp b/src/common/android_storage.cpp index efc7404ae..372fb66b8 100644 --- a/src/common/android_storage.cpp +++ b/src/common/android_storage.cpp @@ -308,9 +308,16 @@ bool MoveAndRenameFile(const std::string& src_full_path, const std::string& dest } std::string TranslateFilePath(const std::string& filepath) { + // "!" at front of path indicates an already-native path. + // This is hacky, but I don't know how else we can do this without a lot of quite invasive + // changes to how Android file IO works. + // TODO: We should definitely change this in favour of a real solution down the line. + if (filepath.front() == '!') { + return filepath.substr(1); + } std::optional userDirLocation = GetUserDirectory(); if (userDirLocation) { - return *userDirLocation + filepath; + return *userDirLocation + "/" + filepath; } return ""; }