From 7292ac0ce5964129b79eb3d2a25855e9f8b9d341 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 15 Nov 2021 23:23:17 +0100 Subject: [PATCH 1/3] Android: Remove DirectoryInitialization from AndroidManifest.xml It isn't a service, so it shouldn't be listed as one. --- Source/Android/app/src/main/AndroidManifest.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Source/Android/app/src/main/AndroidManifest.xml b/Source/Android/app/src/main/AndroidManifest.xml index e46eaf7797..34a5e55af0 100644 --- a/Source/Android/app/src/main/AndroidManifest.xml +++ b/Source/Android/app/src/main/AndroidManifest.xml @@ -132,10 +132,6 @@ android:exported="false" android:theme="@style/DolphinBase" /> - - From 31bfbca92384f5a7f6abfec04f7a6e6758a2b17c Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 16 Nov 2021 00:04:45 +0100 Subject: [PATCH 2/3] Android: Split up GameFileCacheService.onHandleIntent --- .../services/GameFileCacheService.java | 95 +++++++++++-------- 1 file changed, 58 insertions(+), 37 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java index 3be5fb039f..fec5d01bfa 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java @@ -132,8 +132,9 @@ public final class GameFileCacheService extends IntentService } /** - * Asynchronously loads the game file cache from disk without checking - * which games are present on the file system. + * Asynchronously loads the game file cache from disk, without checking + * if the games are still present in the user's configured folders. + * If this has already been called, calling it again has no effect. */ public static void startLoad(Context context) { @@ -182,8 +183,32 @@ public final class GameFileCacheService extends IntentService @Override protected void onHandleIntent(Intent intent) { - // Load the game list cache if it isn't already loaded, otherwise do nothing - if (ACTION_LOAD.equals(intent.getAction()) && gameFileCache == null) + if (ACTION_LOAD.equals(intent.getAction())) + { + load(); + } + + if (ACTION_RESCAN.equals(intent.getAction())) + { + rescan(); + unhandledRescanIntents.decrementAndGet(); + } + + int intentsLeft = unhandledIntents.decrementAndGet(); + if (intentsLeft == 0) + { + sendBroadcast(DONE_LOADING); + } + } + + /** + * Loads the game file cache from disk, without checking if the + * games are still present in the user's configured folders. + * If this has already been called, calling it again has no effect. + */ + private void load() + { + if (gameFileCache == null) { GameFileCache temp = new GameFileCache(); synchronized (temp) @@ -197,45 +222,41 @@ public final class GameFileCacheService extends IntentService } } } + } - // Rescan the file system and update the game list cache with the results - if (ACTION_RESCAN.equals(intent.getAction())) + /** + * Scans for games in the user's configured folders, + * updating the game file cache with the results. + * If load hasn't been called before this, this has no effect. + */ + private void rescan() + { + if (gameFileCache != null) { - if (gameFileCache != null) + String[] gamePaths = GameFileCache.getAllGamePaths(); + + boolean changed; + synchronized (gameFileCache) { - String[] gamePaths = GameFileCache.getAllGamePaths(); - - boolean changed; - synchronized (gameFileCache) - { - changed = gameFileCache.update(gamePaths); - } - if (changed) - { - updateGameFileArray(); - sendBroadcast(CACHE_UPDATED); - } - - boolean additionalMetadataChanged = gameFileCache.updateAdditionalMetadata(); - if (additionalMetadataChanged) - { - updateGameFileArray(); - sendBroadcast(CACHE_UPDATED); - } - - if (changed || additionalMetadataChanged) - { - gameFileCache.save(); - } + changed = gameFileCache.update(gamePaths); + } + if (changed) + { + updateGameFileArray(); + sendBroadcast(CACHE_UPDATED); } - unhandledRescanIntents.decrementAndGet(); - } + boolean additionalMetadataChanged = gameFileCache.updateAdditionalMetadata(); + if (additionalMetadataChanged) + { + updateGameFileArray(); + sendBroadcast(CACHE_UPDATED); + } - int intentsLeft = unhandledIntents.decrementAndGet(); - if (intentsLeft == 0) - { - sendBroadcast(DONE_LOADING); + if (changed || additionalMetadataChanged) + { + gameFileCache.save(); + } } } From ffd8cd059c715143020f2bac4316202531e514cb Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 16 Nov 2021 21:20:59 +0100 Subject: [PATCH 3/3] Android: Make GameFileCacheService not be a service The past few Android releases have been adding restrictions to what services are allowed to do, for the sake of stopping services from using up too much battery in the background. The IntentService class, which GameFileCacheService uses, was even deprecated in Android 11 in light of this. Typically, the reason why you would want use a service instead of using a simple thread or some other concurrency mechanism from the Java standard library is if you want to be able to run code in the background while the user isn't using your app. This isn't actually something we care about for GameFileCacheService -- if Android wants to kill Dolphin there's no reason to keep GameFileCacheService running -- so let's make it not be a service. I'm changing this mainly for the sake of future proofing, but there is one immediate (minor) benefit: Previously, if you tried to launch Dolphin from Android Studio while your phone was locked, the whole app would fail to launch because launching GameFileCacheService wasn't allowed because Dolphin wasn't considered a foreground app. --- .../Android/app/src/main/AndroidManifest.xml | 4 - .../activities/AppLinkActivity.java | 12 +-- .../dolphinemu/adapters/GameAdapter.java | 7 +- .../dolphinemu/adapters/GameRowPresenter.java | 5 +- .../dolphinemu/dialogs/GameDetailsDialog.java | 4 +- .../features/settings/model/Settings.java | 4 +- .../dolphinemu/fragments/ConvertFragment.java | 4 +- ...Service.java => GameFileCacheManager.java} | 94 ++++++++----------- .../services/SyncProgramsJobService.java | 2 +- .../dolphinemu/ui/main/MainActivity.java | 8 +- .../dolphinemu/ui/main/MainPresenter.java | 16 ++-- .../dolphinemu/ui/main/TvMainActivity.java | 18 ++-- .../ui/platform/PlatformGamesFragment.java | 6 +- 13 files changed, 77 insertions(+), 107 deletions(-) rename Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/{GameFileCacheService.java => GameFileCacheManager.java} (75%) diff --git a/Source/Android/app/src/main/AndroidManifest.xml b/Source/Android/app/src/main/AndroidManifest.xml index 34a5e55af0..dc0b95d3ed 100644 --- a/Source/Android/app/src/main/AndroidManifest.xml +++ b/Source/Android/app/src/main/AndroidManifest.xml @@ -132,10 +132,6 @@ android:exported="false" android:theme="@style/DolphinBase" /> - - tryPlay(playAction)); - IntentFilter gameFileCacheIntentFilter = new IntentFilter(GameFileCacheService.DONE_LOADING); + IntentFilter gameFileCacheIntentFilter = new IntentFilter(GameFileCacheManager.DONE_LOADING); BroadcastReceiver gameFileCacheReceiver = new BroadcastReceiver() { @@ -87,7 +87,7 @@ public class AppLinkActivity extends FragmentActivity broadcastManager.registerReceiver(gameFileCacheReceiver, gameFileCacheIntentFilter); DirectoryInitialization.start(this); - GameFileCacheService.startLoad(this); + GameFileCacheManager.startLoad(this); } /** @@ -106,11 +106,11 @@ public class AppLinkActivity extends FragmentActivity // TODO: This approach of getting the game from the game file cache without rescanning the // library means that we can fail to launch games if the cache file has been deleted. - GameFile game = GameFileCacheService.getGameFileByGameId(action.getGameId()); + GameFile game = GameFileCacheManager.getGameFileByGameId(action.getGameId()); // If game == null and the load isn't done, wait for the next GameFileCacheService broadcast. // If game == null and the load is done, call play with a null game, making us exit in failure. - if (game != null || !GameFileCacheService.isLoading()) + if (game != null || !GameFileCacheManager.isLoading()) { play(action, game); } @@ -140,6 +140,6 @@ public class AppLinkActivity extends FragmentActivity mAfterDirectoryInitializationRunner.cancel(); mAfterDirectoryInitializationRunner = null; } - EmulationActivity.launch(this, GameFileCacheService.findSecondDiscAndGetPaths(game), false); + EmulationActivity.launch(this, GameFileCacheManager.findSecondDiscAndGetPaths(game), false); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java index 15210eea2f..d481640c9b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java @@ -9,7 +9,6 @@ import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.RecyclerView; @@ -17,7 +16,7 @@ import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.activities.EmulationActivity; import org.dolphinemu.dolphinemu.dialogs.GamePropertiesDialog; import org.dolphinemu.dolphinemu.model.GameFile; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.utils.PicassoUtils; import org.dolphinemu.dolphinemu.viewholders.GameViewHolder; @@ -77,7 +76,7 @@ public final class GameAdapter extends RecyclerView.Adapter impl holder.textGameTitle.setText(gameFile.getTitle()); - if (GameFileCacheService.findSecondDisc(gameFile) != null) + if (GameFileCacheManager.findSecondDisc(gameFile) != null) { holder.textGameCaption .setText(context.getString(R.string.disc_number, gameFile.getDiscNumber() + 1)); @@ -140,7 +139,7 @@ public final class GameAdapter extends RecyclerView.Adapter impl { GameViewHolder holder = (GameViewHolder) view.getTag(); - String[] paths = GameFileCacheService.findSecondDiscAndGetPaths(holder.gameFile); + String[] paths = GameFileCacheManager.findSecondDiscAndGetPaths(holder.gameFile); EmulationActivity.launch((FragmentActivity) view.getContext(), paths, false); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java index e7a4c12f6a..2414f46669 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java @@ -7,7 +7,6 @@ import android.graphics.drawable.Drawable; import android.view.ViewGroup; import android.widget.ImageView; -import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentActivity; import androidx.leanback.widget.ImageCardView; @@ -16,7 +15,7 @@ import androidx.leanback.widget.Presenter; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.dialogs.GamePropertiesDialog; import org.dolphinemu.dolphinemu.model.GameFile; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.ui.platform.Platform; import org.dolphinemu.dolphinemu.utils.PicassoUtils; import org.dolphinemu.dolphinemu.viewholders.TvGameViewHolder; @@ -56,7 +55,7 @@ public final class GameRowPresenter extends Presenter holder.cardParent.setTitleText(gameFile.getTitle()); - if (GameFileCacheService.findSecondDisc(gameFile) != null) + if (GameFileCacheManager.findSecondDisc(gameFile) != null) { holder.cardParent .setContentText( diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.java index 9ccba86cd2..4b49d76083 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameDetailsDialog.java @@ -15,7 +15,7 @@ import androidx.fragment.app.DialogFragment; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.model.GameFile; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.utils.PicassoUtils; public final class GameDetailsDialog extends DialogFragment @@ -36,7 +36,7 @@ public final class GameDetailsDialog extends DialogFragment @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - GameFile gameFile = GameFileCacheService.addOrGet(getArguments().getString(ARG_GAME_PATH)); + GameFile gameFile = GameFileCacheManager.addOrGet(getArguments().getString(ARG_GAME_PATH)); AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity(), R.style.DolphinDialogBase); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index 15f0ac77c6..51d10ecdbc 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -10,7 +10,7 @@ import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityView; import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; import org.dolphinemu.dolphinemu.utils.IniFile; @@ -233,7 +233,7 @@ public class Settings implements Closeable if (mLoadedRecursiveIsoPathsValue != BooleanSetting.MAIN_RECURSIVE_ISO_PATHS.getBoolean(this)) { // Refresh game library - GameFileCacheService.startRescan(context); + GameFileCacheManager.startRescan(context); } } else diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/ConvertFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/ConvertFragment.java index d1f09bbd50..d283a39025 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/ConvertFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/fragments/ConvertFragment.java @@ -20,7 +20,7 @@ import android.widget.Spinner; import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.model.GameFile; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.ui.platform.Platform; import java.io.File; @@ -136,7 +136,7 @@ public class ConvertFragment extends Fragment implements View.OnClickListener public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - gameFile = GameFileCacheService.addOrGet(requireArguments().getString(ARG_GAME_PATH)); + gameFile = GameFileCacheManager.addOrGet(requireArguments().getString(ARG_GAME_PATH)); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheManager.java similarity index 75% rename from Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java rename to Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheManager.java index fec5d01bfa..f4ce251be1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheService.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/GameFileCacheManager.java @@ -2,28 +2,29 @@ package org.dolphinemu.dolphinemu.services; -import android.app.IntentService; import android.content.Context; import android.content.Intent; import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import org.dolphinemu.dolphinemu.DolphinApplication; import org.dolphinemu.dolphinemu.model.GameFile; import org.dolphinemu.dolphinemu.model.GameFileCache; import org.dolphinemu.dolphinemu.ui.platform.Platform; import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; /** - * A service that loads game list data on a separate thread. + * Loads game list data on a separate thread. */ -public final class GameFileCacheService extends IntentService +public final class GameFileCacheManager { /** * This is broadcast when the contents of the cache change. @@ -37,19 +38,16 @@ public final class GameFileCacheService extends IntentService public static final String DONE_LOADING = "org.dolphinemu.dolphinemu.GAME_FILE_CACHE_DONE_LOADING"; - private static final String ACTION_LOAD = "org.dolphinemu.dolphinemu.LOAD_GAME_FILE_CACHE"; - private static final String ACTION_RESCAN = "org.dolphinemu.dolphinemu.RESCAN_GAME_FILE_CACHE"; - private static GameFileCache gameFileCache = null; private static final AtomicReference gameFiles = new AtomicReference<>(new GameFile[]{}); - private static final AtomicInteger unhandledIntents = new AtomicInteger(0); - private static final AtomicInteger unhandledRescanIntents = new AtomicInteger(0); - public GameFileCacheService() + private static final ExecutorService executor = Executors.newFixedThreadPool(1); + private static final AtomicBoolean loadInProgress = new AtomicBoolean(false); + private static final AtomicBoolean rescanInProgress = new AtomicBoolean(false); + + private GameFileCacheManager() { - // Superclass constructor is called to name the thread on which this service executes. - super("GameFileCacheService"); } public static List getGameFilesForPlatform(Platform platform) @@ -113,7 +111,7 @@ public final class GameFileCacheService extends IntentService */ public static boolean isLoading() { - return unhandledIntents.get() != 0; + return loadInProgress.get(); } /** @@ -121,14 +119,7 @@ public final class GameFileCacheService extends IntentService */ public static boolean isRescanning() { - return unhandledRescanIntents.get() != 0; - } - - private static void startService(Context context, String action) - { - Intent intent = new Intent(context, GameFileCacheService.class); - intent.setAction(action); - context.startService(intent); + return rescanInProgress.get(); } /** @@ -138,10 +129,11 @@ public final class GameFileCacheService extends IntentService */ public static void startLoad(Context context) { - unhandledIntents.getAndIncrement(); - - new AfterDirectoryInitializationRunner().run(context, false, - () -> startService(context, ACTION_LOAD)); + if (loadInProgress.compareAndSet(false, true)) + { + new AfterDirectoryInitializationRunner().run(context, false, + () -> executor.execute(GameFileCacheManager::load)); + } } /** @@ -151,11 +143,11 @@ public final class GameFileCacheService extends IntentService */ public static void startRescan(Context context) { - unhandledIntents.getAndIncrement(); - unhandledRescanIntents.getAndIncrement(); - - new AfterDirectoryInitializationRunner().run(context, false, - () -> startService(context, ACTION_RESCAN)); + if (rescanInProgress.compareAndSet(false, true)) + { + new AfterDirectoryInitializationRunner().run(context, false, + () -> executor.execute(GameFileCacheManager::rescan)); + } } public static GameFile addOrGet(String gamePath) @@ -180,33 +172,12 @@ public final class GameFileCacheService extends IntentService } } - @Override - protected void onHandleIntent(Intent intent) - { - if (ACTION_LOAD.equals(intent.getAction())) - { - load(); - } - - if (ACTION_RESCAN.equals(intent.getAction())) - { - rescan(); - unhandledRescanIntents.decrementAndGet(); - } - - int intentsLeft = unhandledIntents.decrementAndGet(); - if (intentsLeft == 0) - { - sendBroadcast(DONE_LOADING); - } - } - /** * Loads the game file cache from disk, without checking if the * games are still present in the user's configured folders. * If this has already been called, calling it again has no effect. */ - private void load() + private static void load() { if (gameFileCache == null) { @@ -222,6 +193,10 @@ public final class GameFileCacheService extends IntentService } } } + + loadInProgress.set(false); + if (!rescanInProgress.get()) + sendBroadcast(DONE_LOADING); } /** @@ -229,7 +204,7 @@ public final class GameFileCacheService extends IntentService * updating the game file cache with the results. * If load hasn't been called before this, this has no effect. */ - private void rescan() + private static void rescan() { if (gameFileCache != null) { @@ -258,17 +233,22 @@ public final class GameFileCacheService extends IntentService gameFileCache.save(); } } + + rescanInProgress.set(false); + if (!loadInProgress.get()) + sendBroadcast(DONE_LOADING); } - private void updateGameFileArray() + private static void updateGameFileArray() { GameFile[] gameFilesTemp = gameFileCache.getAllGames(); Arrays.sort(gameFilesTemp, (lhs, rhs) -> lhs.getTitle().compareToIgnoreCase(rhs.getTitle())); gameFiles.set(gameFilesTemp); } - private void sendBroadcast(String action) + private static void sendBroadcast(String action) { - LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(action)); + LocalBroadcastManager.getInstance(DolphinApplication.getAppContext()) + .sendBroadcast(new Intent(action)); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java index 9d75c35fc5..c789084343 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/SyncProgramsJobService.java @@ -111,7 +111,7 @@ public class SyncProgramsJobService extends JobService private void getGamesByPlatform(Platform platform) { - updatePrograms = GameFileCacheService.getGameFilesForPlatform(platform); + updatePrograms = GameFileCacheManager.getGameFilesForPlatform(platform); } private void syncPrograms(long channelId) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java index cc17b71aae..497062aa7a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainActivity.java @@ -9,7 +9,6 @@ import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -26,10 +25,9 @@ import org.dolphinemu.dolphinemu.activities.EmulationActivity; import org.dolphinemu.dolphinemu.adapters.PlatformPagerAdapter; import org.dolphinemu.dolphinemu.features.settings.model.IntSetting; import org.dolphinemu.dolphinemu.features.settings.model.NativeConfig; -import org.dolphinemu.dolphinemu.features.settings.model.Settings; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.ui.platform.Platform; import org.dolphinemu.dolphinemu.ui.platform.PlatformGamesView; import org.dolphinemu.dolphinemu.utils.Action1; @@ -279,7 +277,7 @@ public final class MainActivity extends AppCompatActivity public void onRefresh() { setRefreshing(true); - GameFileCacheService.startRescan(this); + GameFileCacheManager.startRescan(this); } /** @@ -341,6 +339,6 @@ public final class MainActivity extends AppCompatActivity mViewPager.setCurrentItem(IntSetting.MAIN_LAST_PLATFORM_TAB.getIntGlobal()); showGames(); - GameFileCacheService.startLoad(this); + GameFileCacheManager.startLoad(this); } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java index 771925f199..9aa95f3998 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/MainPresenter.java @@ -18,7 +18,7 @@ import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.BooleanSetting; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.model.GameFileCache; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; import org.dolphinemu.dolphinemu.utils.BooleanSupplier; import org.dolphinemu.dolphinemu.utils.CompletableFuture; @@ -58,8 +58,8 @@ public final class MainPresenter mView.setVersionString(versionName); IntentFilter filter = new IntentFilter(); - filter.addAction(GameFileCacheService.CACHE_UPDATED); - filter.addAction(GameFileCacheService.DONE_LOADING); + filter.addAction(GameFileCacheManager.CACHE_UPDATED); + filter.addAction(GameFileCacheManager.DONE_LOADING); mBroadcastReceiver = new BroadcastReceiver() { @Override @@ -67,10 +67,10 @@ public final class MainPresenter { switch (intent.getAction()) { - case GameFileCacheService.CACHE_UPDATED: + case GameFileCacheManager.CACHE_UPDATED: mView.showGames(); break; - case GameFileCacheService.DONE_LOADING: + case GameFileCacheManager.DONE_LOADING: mView.setRefreshing(false); break; } @@ -102,7 +102,7 @@ public final class MainPresenter case R.id.menu_refresh: mView.setRefreshing(true); - GameFileCacheService.startRescan(context); + GameFileCacheManager.startRescan(context); return true; case R.id.button_add_directory: @@ -140,12 +140,12 @@ public final class MainPresenter mDirToAdd = null; } - if (sShouldRescanLibrary && !GameFileCacheService.isRescanning()) + if (sShouldRescanLibrary && !GameFileCacheManager.isRescanning()) { new AfterDirectoryInitializationRunner().run(mContext, false, () -> { mView.setRefreshing(true); - GameFileCacheService.startRescan(mContext); + GameFileCacheManager.startRescan(mContext); }); } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java index f8a78c4934..15f8c866e7 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/main/TvMainActivity.java @@ -7,7 +7,6 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.util.TypedValue; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; @@ -28,9 +27,8 @@ import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; import org.dolphinemu.dolphinemu.model.GameFile; import org.dolphinemu.dolphinemu.model.TvSettingsItem; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; import org.dolphinemu.dolphinemu.ui.platform.Platform; -import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; import org.dolphinemu.dolphinemu.utils.FileBrowserHelper; import org.dolphinemu.dolphinemu.utils.PermissionsHandler; @@ -77,7 +75,7 @@ public final class TvMainActivity extends FragmentActivity if (DirectoryInitialization.shouldStart(this)) { DirectoryInitialization.start(this); - GameFileCacheService.startLoad(this); + GameFileCacheManager.startLoad(this); } mPresenter.onResume(); @@ -124,7 +122,7 @@ public final class TvMainActivity extends FragmentActivity mSwipeRefresh.setOnRefreshListener(this); - setRefreshing(GameFileCacheService.isLoading()); + setRefreshing(GameFileCacheManager.isLoading()); final FragmentManager fragmentManager = getSupportFragmentManager(); mBrowseFragment = new BrowseSupportFragment(); @@ -152,7 +150,7 @@ public final class TvMainActivity extends FragmentActivity TvGameViewHolder holder = (TvGameViewHolder) itemViewHolder; // Start the emulation activity and send the path of the clicked ISO to it. - String[] paths = GameFileCacheService.findSecondDiscAndGetPaths(holder.gameFile); + String[] paths = GameFileCacheManager.findSecondDiscAndGetPaths(holder.gameFile); EmulationActivity.launch(TvMainActivity.this, paths, false); } }); @@ -294,7 +292,7 @@ public final class TvMainActivity extends FragmentActivity } DirectoryInitialization.start(this); - GameFileCacheService.startLoad(this); + GameFileCacheManager.startLoad(this); } } @@ -305,7 +303,7 @@ public final class TvMainActivity extends FragmentActivity public void onRefresh() { setRefreshing(true); - GameFileCacheService.startRescan(this); + GameFileCacheManager.startRescan(this); } private void buildRowsAdapter() @@ -315,12 +313,12 @@ public final class TvMainActivity extends FragmentActivity if (!DirectoryInitialization.isWaitingForWriteAccess(this)) { - GameFileCacheService.startLoad(this); + GameFileCacheManager.startLoad(this); } for (Platform platform : Platform.values()) { - ListRow row = buildGamesRow(platform, GameFileCacheService.getGameFilesForPlatform(platform)); + ListRow row = buildGamesRow(platform, GameFileCacheManager.getGameFilesForPlatform(platform)); // Add row to the adapter only if it is not empty. if (row != null) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/platform/PlatformGamesFragment.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/platform/PlatformGamesFragment.java index b5c2c7fa79..641802df54 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/platform/PlatformGamesFragment.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/platform/PlatformGamesFragment.java @@ -17,7 +17,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.adapters.GameAdapter; -import org.dolphinemu.dolphinemu.services.GameFileCacheService; +import org.dolphinemu.dolphinemu.services.GameFileCacheManager; public final class PlatformGamesFragment extends Fragment implements PlatformGamesView { @@ -73,7 +73,7 @@ public final class PlatformGamesFragment extends Fragment implements PlatformGam mRecyclerView.addItemDecoration(new GameAdapter.SpacesItemDecoration(8)); - setRefreshing(GameFileCacheService.isLoading()); + setRefreshing(GameFileCacheManager.isLoading()); showGames(); } @@ -96,7 +96,7 @@ public final class PlatformGamesFragment extends Fragment implements PlatformGam if (mAdapter != null) { Platform platform = (Platform) getArguments().getSerializable(ARG_PLATFORM); - mAdapter.swapDataSet(GameFileCacheService.getGameFilesForPlatform(platform)); + mAdapter.swapDataSet(GameFileCacheManager.getGameFilesForPlatform(platform)); } }