Merge pull request #10272 from JosJuice/android-intent-uri
Android: Rework intent handling to work under scoped storage
This commit is contained in:
commit
820a424dcd
|
@ -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,29 +37,62 @@ 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");
|
|
||||||
if (start_files == null)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
// Start the emulation activity, send the ISO passed in and finish the main activity
|
// Start the emulation activity, send the ISO passed in and finish the main activity
|
||||||
EmulationActivity.launch(parent, start_files, false);
|
EmulationActivity.launch(parent, gamesToLaunch, false);
|
||||||
parent.finish();
|
parent.finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String[] getGamesFromIntent(Intent intent)
|
||||||
|
{
|
||||||
|
// Priority order when looking for game paths in an intent:
|
||||||
|
//
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* There isn't a good way to determine a new session. setSessionTime is called if the main
|
* There isn't a good way to determine a new session. setSessionTime is called if the main
|
||||||
* activity goes into the background.
|
* activity goes into the background.
|
||||||
|
|
Loading…
Reference in New Issue