From ac65c7970cd51bbeeb81ba796210344cae16affc Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 16 Mar 2021 22:58:23 +0100 Subject: [PATCH] Android: Fix rescanning on first app launch after cache clear GameFileCacheService.startRescan (in MainPresenter.onResume) does nothing if called before GameFileCacheService.startLoad. Fixes a 3f71c36 regression where already added games would not show up after app launch under specific circumstances. Unfortunately the loading indicator still doesn't show up during a rescan initiated by app launch, but that would be more annoying to fix, so I will leave it for now. --- .../services/GameFileCacheService.java | 50 +++++++++++++------ .../dolphinemu/ui/main/MainActivity.java | 4 +- .../dolphinemu/ui/main/MainPresenter.java | 2 +- .../dolphinemu/ui/main/TvMainActivity.java | 4 +- 4 files changed, 39 insertions(+), 21 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 0abd072467..6d3ee84e52 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 @@ -42,6 +42,7 @@ public final class GameFileCacheService extends IntentService 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() { @@ -105,11 +106,22 @@ public final class GameFileCacheService extends IntentService return new String[]{gameFile.getPath(), secondFile.getPath()}; } + /** + * Returns true if in the process of either loading the cache or rescanning. + */ public static boolean isLoading() { return unhandledIntents.get() != 0; } + /** + * Returns true if in the process of rescanning. + */ + public static boolean isRescanning() + { + return unhandledRescanIntents.get() != 0; + } + private static void startService(Context context, String action) { Intent intent = new Intent(context, GameFileCacheService.class); @@ -137,6 +149,7 @@ 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)); @@ -173,29 +186,34 @@ 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()) && gameFileCache != null) + if (ACTION_RESCAN.equals(intent.getAction())) { - synchronized (gameFileCache) + if (gameFileCache != null) { - boolean changed = gameFileCache.update(); - if (changed) + synchronized (gameFileCache) { - updateGameFileArray(); - sendBroadcast(CACHE_UPDATED); - } + boolean changed = gameFileCache.update(); + if (changed) + { + updateGameFileArray(); + sendBroadcast(CACHE_UPDATED); + } - boolean additionalMetadataChanged = gameFileCache.updateAdditionalMetadata(); - if (additionalMetadataChanged) - { - updateGameFileArray(); - sendBroadcast(CACHE_UPDATED); - } + boolean additionalMetadataChanged = gameFileCache.updateAdditionalMetadata(); + if (additionalMetadataChanged) + { + updateGameFileArray(); + sendBroadcast(CACHE_UPDATED); + } - if (changed || additionalMetadataChanged) - { - gameFileCache.save(); + if (changed || additionalMetadataChanged) + { + gameFileCache.save(); + } } } + + unhandledRescanIntents.decrementAndGet(); } int intentsLeft = unhandledIntents.decrementAndGet(); 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 507f994fed..0418f453de 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 @@ -82,8 +82,6 @@ public final class MainActivity extends AppCompatActivity { super.onResume(); - mPresenter.onResume(); - if (DirectoryInitialization.shouldStart(this)) { DirectoryInitialization.start(this); @@ -91,6 +89,8 @@ public final class MainActivity extends AppCompatActivity .run(this, false, this::setPlatformTabsAndStartGameFileCacheService); } + mPresenter.onResume(); + // In case the user changed a setting that affects how games are displayed, // such as system language, cover downloading... forEachPlatformGamesView(PlatformGamesView::refetchMetadata); 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 72c91a5f99..ed02a6f22e 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 @@ -132,7 +132,7 @@ public final class MainPresenter mDirToAdd = null; } - if (sShouldRescanLibrary && !GameFileCacheService.isLoading()) + if (sShouldRescanLibrary && !GameFileCacheService.isRescanning()) { new AfterDirectoryInitializationRunner().run(mContext, false, () -> { 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 7f160df482..b03b894493 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 @@ -71,14 +71,14 @@ public final class TvMainActivity extends FragmentActivity { super.onResume(); - mPresenter.onResume(); - if (DirectoryInitialization.shouldStart(this)) { DirectoryInitialization.start(this); GameFileCacheService.startLoad(this); } + mPresenter.onResume(); + // In case the user changed a setting that affects how games are displayed, // such as system language, cover downloading... refetchMetadata();