android: Re-implement title uninstallation via Service::AM::UninstallProgram

This commit is contained in:
OpenSauce04 2026-03-07 17:55:01 +00:00 committed by OpenSauce
parent a8ebd0f551
commit 97c9a51015
3 changed files with 22 additions and 5 deletions

View File

@ -230,6 +230,8 @@ object NativeLibrary {
external fun playTimeManagerGetPlayTime(titleId: Long): Long
external fun playTimeManagerGetCurrentTitleId(): Long
external fun uninstallTitle(titleId: Long): Boolean
private var coreErrorAlertResult = false
private val coreErrorAlertLock = Object()

View File

@ -323,14 +323,16 @@ class GameAdapter(
}
}
val titleId = game.titleId
val dlcTitleId = titleId or 0x8C00000000L
val updateTitleId = titleId or 0xE00000000L
popup.setOnMenuItemClickListener { menuItem ->
val uninstallAction: () -> Unit = {
when (menuItem.itemId) {
R.id.game_context_uninstall -> CitraApplication.documentsTree.deleteDocument(dirs.gameDir)
R.id.game_context_uninstall_dlc -> FileUtil.deleteDocument(CitraApplication.documentsTree.folderUriHelper(dirs.dlcDir)
.toString())
R.id.game_context_uninstall_updates -> FileUtil.deleteDocument(CitraApplication.documentsTree.folderUriHelper(dirs.updatesDir)
.toString())
R.id.game_context_uninstall -> NativeLibrary.uninstallTitle(titleId)
R.id.game_context_uninstall_dlc -> NativeLibrary.uninstallTitle(dlcTitleId)
R.id.game_context_uninstall_updates -> NativeLibrary.uninstallTitle(updateTitleId)
}
ViewModelProvider(activity)[GamesViewModel::class.java].reloadGames(true)
bottomSheetDialog.dismiss()

View File

@ -1107,4 +1107,17 @@ void Java_org_citra_citra_1emu_NativeLibrary_setInsertedCartridge(JNIEnv* env, j
inserted_cartridge = GetJString(env, path);
}
jboolean Java_org_citra_citra_1emu_NativeLibrary_uninstallTitle(JNIEnv* env, jobject obj,
jlong j_titleid) {
const auto titleid = static_cast<long long>(env, j_titleid);
// TODO: Don't hard-code to SDMC? (CBA to pass a value from Kotlin at the moment) -OS
const auto result = Service::AM::UninstallProgram(Service::FS::MediaType::SDMC, titleid);
if (result.IsError()) {
LOG_ERROR(Frontend, "Failed to uninstall '{}': 0x{:08X}", std::to_string(titleid),
result.raw);
return false;
}
return true;
}
} // extern "C"