Android: Call UICommon::Init at app start instead of emulation start

Much of our native code assumes that UICommon::Init has been called
(for reasons such as wanting to access the user's settings),
so not calling it until emulation start heavily limits what native
code we can use in the Android GUI (except during emulation).
This commit is contained in:
JosJuice
2019-06-16 14:41:58 +02:00
parent 47e1108d57
commit 9f3f45aa5f
6 changed files with 67 additions and 39 deletions

View File

@ -349,10 +349,29 @@ public final class NativeLibrary
public static native int DefaultCPUCore();
public static native void ReloadConfig();
/**
* Initializes the native parts of the app.
*
* Should be called at app start before running any other native code
* (other than the native methods in DirectoryInitialization).
*/
public static native void Initialize();
/**
* Tells analytics that Dolphin has been started.
*
* Since users typically don't explicitly close Android apps, it's appropriate to
* call this not only when the app starts but also when the user returns to the app
* after not using it for a significant amount of time.
*/
public static native void ReportStartToAnalytics();
/**
* Begins emulation.
*/
public static native void Run(String[] path, boolean firstOpen);
public static native void Run(String[] path);
/**
* Begins emulation from the specified savestate.

View File

@ -2,6 +2,7 @@ package org.dolphinemu.dolphinemu.features.settings.model;
import android.text.TextUtils;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityView;
import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile;
@ -175,6 +176,9 @@ public class Settings
SettingsFile.saveFile(fileName, iniSections, view);
}
// Notify the native code of the changes
NativeLibrary.ReloadConfig();
}
else
{

View File

@ -82,12 +82,7 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C
mPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
String[] gamePaths = getArguments().getStringArray(KEY_GAMEPATHS);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
boolean firstOpen = preferences.getBoolean(StartupHandler.NEW_SESSION, true);
SharedPreferences.Editor sPrefsEditor = preferences.edit();
sPrefsEditor.putBoolean(StartupHandler.NEW_SESSION, false);
sPrefsEditor.apply();
mEmulationState = new EmulationState(gamePaths, getTemporaryStateFilePath(), firstOpen);
mEmulationState = new EmulationState(gamePaths, getTemporaryStateFilePath());
}
/**
@ -271,12 +266,10 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C
private Surface mSurface;
private boolean mRunWhenSurfaceIsValid;
private boolean loadPreviousTemporaryState;
private boolean firstOpen;
private final String temporaryStatePath;
EmulationState(String[] gamePaths, String temporaryStatePath, boolean firstOpen)
EmulationState(String[] gamePaths, String temporaryStatePath)
{
this.firstOpen = firstOpen;
mGamePaths = gamePaths;
this.temporaryStatePath = temporaryStatePath;
// Starting state is stopped.
@ -420,7 +413,7 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C
else
{
Log.debug("[EmulationFragment] Starting emulation thread.");
NativeLibrary.Run(mGamePaths, firstOpen);
NativeLibrary.Run(mGamePaths);
}
}, "NativeEmulation");
mEmulationThread.start();

View File

@ -67,6 +67,8 @@ public final class DirectoryInitialization
{
initializeInternalStorage(context);
initializeExternalStorage(context);
NativeLibrary.Initialize();
NativeLibrary.ReportStartToAnalytics();
directoryState = DirectoryInitializationState.DOLPHIN_DIRECTORIES_INITIALIZED;
}

View File

@ -8,15 +8,15 @@ import android.preference.PreferenceManager;
import android.support.v4.app.FragmentActivity;
import android.text.TextUtils;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
import java.util.Date;
public final class StartupHandler
{
public static final String NEW_SESSION = "NEW_SESSION";
public static final String LAST_CLOSED = "LAST_CLOSED";
public static final Long SESSION_TIMEOUT = 21600000L; // 6 hours in milliseconds
public static final long SESSION_TIMEOUT = 21600000L; // 6 hours in milliseconds
public static void HandleInit(FragmentActivity parent)
{
@ -66,15 +66,13 @@ public final class StartupHandler
*/
public static void checkSessionReset(Context context)
{
Long currentTime = new Date(System.currentTimeMillis()).getTime();
long currentTime = new Date(System.currentTimeMillis()).getTime();
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Long lastOpen = preferences.getLong(LAST_CLOSED, 0);
long lastOpen = preferences.getLong(LAST_CLOSED, 0);
if (currentTime > (lastOpen + SESSION_TIMEOUT))
{
// Passed at emulation start to trigger first open event.
SharedPreferences.Editor sPrefsEditor = preferences.edit();
sPrefsEditor.putBoolean(NEW_SESSION, true);
sPrefsEditor.apply();
new AfterDirectoryInitializationRunner().run(context,
() -> NativeLibrary.ReportStartToAnalytics());
}
}
}