diff --git a/pkg/android/phoenix-common/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java b/pkg/android/phoenix-common/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java index d6145f239f..a7c8b56d54 100644 --- a/pkg/android/phoenix-common/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java +++ b/pkg/android/phoenix-common/src/com/retroarch/browser/retroactivity/RetroActivityCommon.java @@ -1,15 +1,9 @@ package com.retroarch.browser.retroactivity; -import com.google.android.play.core.splitinstall.SplitInstallManager; -import com.google.android.play.core.splitinstall.SplitInstallManagerFactory; -import com.google.android.play.core.splitinstall.SplitInstallRequest; -import com.google.android.play.core.splitinstall.SplitInstallSessionState; -import com.google.android.play.core.splitinstall.SplitInstallStateUpdatedListener; -import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus; -import com.google.android.play.core.tasks.OnFailureListener; -import com.google.android.play.core.tasks.OnSuccessListener; import com.retroarch.BuildConfig; import com.retroarch.browser.preferences.util.UserPreferences; +import com.retroarch.playcore.PlayCoreManager; + import android.annotation.TargetApi; import android.app.NativeActivity; import android.content.res.Configuration; @@ -38,7 +32,6 @@ import android.util.Log; import java.io.File; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.Locale; @@ -63,58 +56,21 @@ public class RetroActivityCommon extends NativeActivity public static int FRONTEND_ORIENTATION_270 = 3; public static int RETRO_RUMBLE_STRONG = 0; public static int RETRO_RUMBLE_WEAK = 1; - public static int INSTALL_STATUS_DOWNLOADING = 0; - public static int INSTALL_STATUS_INSTALLING = 1; - public static int INSTALL_STATUS_INSTALLED = 2; - public static int INSTALL_STATUS_FAILED = 3; public boolean sustainedPerformanceMode = true; public int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; - private final SplitInstallStateUpdatedListener listener = new SplitInstallStateUpdatedListener() { - @Override - public void onStateUpdate(SplitInstallSessionState state) { - List moduleNames = state.moduleNames(); - String[] coreNames = new String[moduleNames.size()]; - - for(int i = 0; i < moduleNames.size(); i++) { - coreNames[i] = unsanitizeCoreName(moduleNames.get(i)); - } - - switch(state.status()) { - case SplitInstallSessionStatus.DOWNLOADING: - coreInstallStatusChanged(coreNames, INSTALL_STATUS_DOWNLOADING, state.bytesDownloaded(), state.totalBytesToDownload()); - break; - case SplitInstallSessionStatus.INSTALLING: - coreInstallStatusChanged(coreNames, INSTALL_STATUS_INSTALLING, state.bytesDownloaded(), state.totalBytesToDownload()); - break; - case SplitInstallSessionStatus.INSTALLED: - updateSymlinks(); - - coreInstallStatusChanged(coreNames, INSTALL_STATUS_INSTALLED, state.bytesDownloaded(), state.totalBytesToDownload()); - break; - case SplitInstallSessionStatus.FAILED: - coreInstallStatusChanged(coreNames, INSTALL_STATUS_FAILED, state.bytesDownloaded(), state.totalBytesToDownload()); - break; - } - } - }; - @Override protected void onCreate(Bundle savedInstanceState) { cleanupSymlinks(); updateSymlinks(); - SplitInstallManager manager = SplitInstallManagerFactory.create(this); - manager.registerListener(listener); - + PlayCoreManager.getInstance().onCreate(this); super.onCreate(savedInstanceState); } @Override protected void onDestroy() { - SplitInstallManager manager = SplitInstallManagerFactory.create(this); - manager.unregisterListener(listener); - + PlayCoreManager.getInstance().onDestroy(); super.onDestroy(); } @@ -442,8 +398,7 @@ public class RetroActivityCommon extends NativeActivity * @return the list of installed cores */ public String[] getInstalledCores() { - SplitInstallManager manager = SplitInstallManagerFactory.create(this); - String[] modules = manager.getInstalledModules().toArray(new String[0]); + String[] modules = PlayCoreManager.getInstance().getInstalledModules(); List cores = new ArrayList<>(); List availableCores = Arrays.asList(getAvailableCores()); @@ -473,25 +428,7 @@ public class RetroActivityCommon extends NativeActivity SharedPreferences prefs = UserPreferences.getPreferences(this); prefs.edit().remove("core_deleted_" + coreName).apply(); - SplitInstallManager manager = SplitInstallManagerFactory.create(this); - SplitInstallRequest request = SplitInstallRequest.newBuilder() - .addModule(sanitizeCoreName(coreName)) - .build(); - - manager.startInstall(request) - .addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(Integer result) { - coreInstallInitiated(coreName, true); - } - }) - - .addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(Exception e) { - coreInstallInitiated(coreName, false); - } - }); + PlayCoreManager.getInstance().downloadCore(coreName); } /** @@ -511,8 +448,7 @@ public class RetroActivityCommon extends NativeActivity SharedPreferences prefs = UserPreferences.getPreferences(this); prefs.edit().putBoolean("core_deleted_" + coreName, true).apply(); - SplitInstallManager manager = SplitInstallManagerFactory.create(this); - manager.deferredUninstall(Collections.singletonList(sanitizeCoreName(coreName))); + PlayCoreManager.getInstance().deleteCore(coreName); } @@ -527,7 +463,7 @@ public class RetroActivityCommon extends NativeActivity * @param coreName Name of the core that the install is initiated for. * @param successful true if success, false if failure */ - private native void coreInstallInitiated(String coreName, boolean successful); + public native void coreInstallInitiated(String coreName, boolean successful); /** * Called when the status of a core install has changed. @@ -538,7 +474,7 @@ public class RetroActivityCommon extends NativeActivity * @param bytesDownloaded Number of bytes downloaded. * @param totalBytesToDownload Total number of bytes to download. */ - private native void coreInstallStatusChanged(String[] coreNames, int status, long bytesDownloaded, long totalBytesToDownload); + public native void coreInstallStatusChanged(String[] coreNames, int status, long bytesDownloaded, long totalBytesToDownload); @@ -554,7 +490,7 @@ public class RetroActivityCommon extends NativeActivity * @param coreName Name of the core to sanitize. * @return The sanitized core name. */ - private String sanitizeCoreName(String coreName) { + public String sanitizeCoreName(String coreName) { return "core_" + coreName.replace('-', '_'); } @@ -564,7 +500,7 @@ public class RetroActivityCommon extends NativeActivity * @param coreName Name of the core to unsanitize. * @return The unsanitized core name. */ - private String unsanitizeCoreName(String coreName) { + public String unsanitizeCoreName(String coreName) { if(coreName.equals("core_mesen_s")) { return "mesen-s"; } @@ -605,7 +541,7 @@ public class RetroActivityCommon extends NativeActivity * Triggers a symlink update in the known places that Dynamic Feature Modules * are installed to. */ - private void updateSymlinks() { + public void updateSymlinks() { if(!isPlayStoreBuild()) return; traverseFilesystem(getFilesDir()); diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index cc47803226..9846918ccb 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -15,7 +15,7 @@ moduleNames = state.moduleNames(); + String[] coreNames = new String[moduleNames.size()]; + + for(int i = 0; i < moduleNames.size(); i++) { + coreNames[i] = activity.unsanitizeCoreName(moduleNames.get(i)); + } + + switch(state.status()) { + case SplitInstallSessionStatus.DOWNLOADING: + activity.coreInstallStatusChanged(coreNames, INSTALL_STATUS_DOWNLOADING, state.bytesDownloaded(), state.totalBytesToDownload()); + break; + case SplitInstallSessionStatus.INSTALLING: + activity.coreInstallStatusChanged(coreNames, INSTALL_STATUS_INSTALLING, state.bytesDownloaded(), state.totalBytesToDownload()); + break; + case SplitInstallSessionStatus.INSTALLED: + activity.updateSymlinks(); + + activity.coreInstallStatusChanged(coreNames, INSTALL_STATUS_INSTALLED, state.bytesDownloaded(), state.totalBytesToDownload()); + break; + case SplitInstallSessionStatus.FAILED: + activity.coreInstallStatusChanged(coreNames, INSTALL_STATUS_FAILED, state.bytesDownloaded(), state.totalBytesToDownload()); + break; + } + } + }; + + public static PlayCoreManager getInstance() { + if (instance == null) { + instance = new PlayCoreManager(); + } + + return instance; + } + + public void onCreate(RetroActivityCommon newActivity) { + activity = newActivity; + + SplitInstallManager manager = SplitInstallManagerFactory.create(activity); + manager.registerListener(listener); + } + + public void onDestroy() { + SplitInstallManager manager = SplitInstallManagerFactory.create(activity); + manager.unregisterListener(listener); + + activity = null; + } + + public String[] getInstalledModules() { + SplitInstallManager manager = SplitInstallManagerFactory.create(activity); + return manager.getInstalledModules().toArray(new String[0]); + } + + public void downloadCore(final String coreName) { + SplitInstallManager manager = SplitInstallManagerFactory.create(activity); + SplitInstallRequest request = SplitInstallRequest.newBuilder() + .addModule(activity.sanitizeCoreName(coreName)) + .build(); + + manager.startInstall(request) + .addOnSuccessListener(new OnSuccessListener() { + @Override + public void onSuccess(Integer result) { + activity.coreInstallInitiated(coreName, true); + } + }) + + .addOnFailureListener(new OnFailureListener() { + @Override + public void onFailure(Exception e) { + activity.coreInstallInitiated(coreName, false); + } + }); + } + + public void deleteCore(String coreName) { + SplitInstallManager manager = SplitInstallManagerFactory.create(activity); + manager.deferredUninstall(Collections.singletonList(activity.sanitizeCoreName(coreName))); + } +} diff --git a/pkg/android/play-core-impl/com/retroarch/playcore/RetroArchApplication.java b/pkg/android/play-core-impl/com/retroarch/playcore/RetroArchApplication.java new file mode 100644 index 0000000000..81ad4f1f51 --- /dev/null +++ b/pkg/android/play-core-impl/com/retroarch/playcore/RetroArchApplication.java @@ -0,0 +1,5 @@ +package com.retroarch.playcore; + +import com.google.android.play.core.splitcompat.SplitCompatApplication; + +public class RetroArchApplication extends SplitCompatApplication {} diff --git a/pkg/android/play-core-stub/com/retroarch/playcore/PlayCoreManager.java b/pkg/android/play-core-stub/com/retroarch/playcore/PlayCoreManager.java new file mode 100644 index 0000000000..9474915d7c --- /dev/null +++ b/pkg/android/play-core-stub/com/retroarch/playcore/PlayCoreManager.java @@ -0,0 +1,28 @@ +package com.retroarch.playcore; + +import com.retroarch.browser.retroactivity.RetroActivityCommon; + +public class PlayCoreManager { + + private PlayCoreManager() {} + + private static PlayCoreManager instance; + + public static PlayCoreManager getInstance() { + if (instance == null) { + instance = new PlayCoreManager(); + } + + return instance; + } + + public void onCreate(RetroActivityCommon newActivity) {} + public void onDestroy() {} + + public String[] getInstalledModules() { + return new String[0]; + } + + public void downloadCore(final String coreName) {} + public void deleteCore(String coreName) {} +} diff --git a/pkg/android/play-core-stub/com/retroarch/playcore/RetroArchApplication.java b/pkg/android/play-core-stub/com/retroarch/playcore/RetroArchApplication.java new file mode 100644 index 0000000000..caf95da497 --- /dev/null +++ b/pkg/android/play-core-stub/com/retroarch/playcore/RetroArchApplication.java @@ -0,0 +1,5 @@ +package com.retroarch.playcore; + +import android.app.Application; + +public class RetroArchApplication extends Application {}