Merge pull request #10272 from JosJuice/android-intent-uri

Android: Rework intent handling to work under scoped storage
This commit is contained in:
JMC47 2021-12-20 14:30:16 -05:00 committed by GitHub
commit 820a424dcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2,8 +2,11 @@
package org.dolphinemu.dolphinemu.utils; package org.dolphinemu.dolphinemu.utils;
import android.content.ClipData;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.text.TextUtils; import android.text.TextUtils;
@ -15,6 +18,7 @@ import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import java.time.Instant; import java.time.Instant;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Objects;
public final class StartupHandler public final class StartupHandler
{ {
@ -33,27 +37,60 @@ public final class StartupHandler
if (TvUtil.isLeanback(parent)) if (TvUtil.isLeanback(parent))
TvUtil.scheduleSyncingChannel(parent); TvUtil.scheduleSyncingChannel(parent);
String[] start_files = null; String[] gamesToLaunch = getGamesFromIntent(parent.getIntent());
Bundle extras = parent.getIntent().getExtras(); if (gamesToLaunch != null && gamesToLaunch.length > 0)
if (extras != null)
{ {
start_files = extras.getStringArray("AutoStartFiles"); // Start the emulation activity, send the ISO passed in and finish the main activity
if (start_files == null) EmulationActivity.launch(parent, gamesToLaunch, false);
{ parent.finish();
String start_file = extras.getString("AutoStartFile");
if (!TextUtils.isEmpty(start_file))
{
start_files = new String[]{start_file};
}
} }
} }
if (start_files != null && start_files.length > 0) private static String[] getGamesFromIntent(Intent intent)
{ {
// Start the emulation activity, send the ISO passed in and finish the main activity // Priority order when looking for game paths in an intent:
EmulationActivity.launch(parent, start_files, false); //
parent.finish(); // Specifying multiple discs (for multi-disc games) is prioritized over specifying a single
// disc. But most of the time, only a single disc will have been specified anyway.
//
// Specifying content URIs (compatible with scoped storage) is prioritized over raw paths.
// The intention is that if a frontend app specifies both a content URI and a raw path, newer
// versions of Dolphin will work correctly under scoped storage, while older versions of Dolphin
// (which don't use scoped storage and don't support content URIs) will also work.
// 1. Content URI, multiple
ClipData clipData = intent.getClipData();
if (clipData != null)
{
String[] uris = new String[clipData.getItemCount()];
for (int i = 0; i < uris.length; i++)
{
uris[i] = Objects.toString(clipData.getItemAt(i).getUri());
} }
return uris;
}
// 2. Content URI, single
Uri uri = intent.getData();
if (uri != null)
return new String[]{uri.toString()};
Bundle extras = intent.getExtras();
if (extras != null)
{
// 3. File path, multiple
String[] paths = extras.getStringArray("AutoStartFiles");
if (paths != null)
return paths;
// 4. File path, single
String path = extras.getString("AutoStartFile");
if (!TextUtils.isEmpty(path))
return new String[]{path};
}
// Nothing was found
return null;
} }
/** /**