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.
This commit is contained in:
parent
f44f20560d
commit
ac65c7970c
|
@ -42,6 +42,7 @@ public final class GameFileCacheService extends IntentService
|
||||||
private static final AtomicReference<GameFile[]> gameFiles =
|
private static final AtomicReference<GameFile[]> gameFiles =
|
||||||
new AtomicReference<>(new GameFile[]{});
|
new AtomicReference<>(new GameFile[]{});
|
||||||
private static final AtomicInteger unhandledIntents = new AtomicInteger(0);
|
private static final AtomicInteger unhandledIntents = new AtomicInteger(0);
|
||||||
|
private static final AtomicInteger unhandledRescanIntents = new AtomicInteger(0);
|
||||||
|
|
||||||
public GameFileCacheService()
|
public GameFileCacheService()
|
||||||
{
|
{
|
||||||
|
@ -105,11 +106,22 @@ public final class GameFileCacheService extends IntentService
|
||||||
return new String[]{gameFile.getPath(), secondFile.getPath()};
|
return new String[]{gameFile.getPath(), secondFile.getPath()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if in the process of either loading the cache or rescanning.
|
||||||
|
*/
|
||||||
public static boolean isLoading()
|
public static boolean isLoading()
|
||||||
{
|
{
|
||||||
return unhandledIntents.get() != 0;
|
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)
|
private static void startService(Context context, String action)
|
||||||
{
|
{
|
||||||
Intent intent = new Intent(context, GameFileCacheService.class);
|
Intent intent = new Intent(context, GameFileCacheService.class);
|
||||||
|
@ -137,6 +149,7 @@ public final class GameFileCacheService extends IntentService
|
||||||
public static void startRescan(Context context)
|
public static void startRescan(Context context)
|
||||||
{
|
{
|
||||||
unhandledIntents.getAndIncrement();
|
unhandledIntents.getAndIncrement();
|
||||||
|
unhandledRescanIntents.getAndIncrement();
|
||||||
|
|
||||||
new AfterDirectoryInitializationRunner().run(context, false,
|
new AfterDirectoryInitializationRunner().run(context, false,
|
||||||
() -> startService(context, ACTION_RESCAN));
|
() -> 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
|
// 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();
|
synchronized (gameFileCache)
|
||||||
if (changed)
|
|
||||||
{
|
{
|
||||||
updateGameFileArray();
|
boolean changed = gameFileCache.update();
|
||||||
sendBroadcast(CACHE_UPDATED);
|
if (changed)
|
||||||
}
|
{
|
||||||
|
updateGameFileArray();
|
||||||
|
sendBroadcast(CACHE_UPDATED);
|
||||||
|
}
|
||||||
|
|
||||||
boolean additionalMetadataChanged = gameFileCache.updateAdditionalMetadata();
|
boolean additionalMetadataChanged = gameFileCache.updateAdditionalMetadata();
|
||||||
if (additionalMetadataChanged)
|
if (additionalMetadataChanged)
|
||||||
{
|
{
|
||||||
updateGameFileArray();
|
updateGameFileArray();
|
||||||
sendBroadcast(CACHE_UPDATED);
|
sendBroadcast(CACHE_UPDATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed || additionalMetadataChanged)
|
if (changed || additionalMetadataChanged)
|
||||||
{
|
{
|
||||||
gameFileCache.save();
|
gameFileCache.save();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unhandledRescanIntents.decrementAndGet();
|
||||||
}
|
}
|
||||||
|
|
||||||
int intentsLeft = unhandledIntents.decrementAndGet();
|
int intentsLeft = unhandledIntents.decrementAndGet();
|
||||||
|
|
|
@ -82,8 +82,6 @@ public final class MainActivity extends AppCompatActivity
|
||||||
{
|
{
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
mPresenter.onResume();
|
|
||||||
|
|
||||||
if (DirectoryInitialization.shouldStart(this))
|
if (DirectoryInitialization.shouldStart(this))
|
||||||
{
|
{
|
||||||
DirectoryInitialization.start(this);
|
DirectoryInitialization.start(this);
|
||||||
|
@ -91,6 +89,8 @@ public final class MainActivity extends AppCompatActivity
|
||||||
.run(this, false, this::setPlatformTabsAndStartGameFileCacheService);
|
.run(this, false, this::setPlatformTabsAndStartGameFileCacheService);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mPresenter.onResume();
|
||||||
|
|
||||||
// In case the user changed a setting that affects how games are displayed,
|
// In case the user changed a setting that affects how games are displayed,
|
||||||
// such as system language, cover downloading...
|
// such as system language, cover downloading...
|
||||||
forEachPlatformGamesView(PlatformGamesView::refetchMetadata);
|
forEachPlatformGamesView(PlatformGamesView::refetchMetadata);
|
||||||
|
|
|
@ -132,7 +132,7 @@ public final class MainPresenter
|
||||||
mDirToAdd = null;
|
mDirToAdd = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sShouldRescanLibrary && !GameFileCacheService.isLoading())
|
if (sShouldRescanLibrary && !GameFileCacheService.isRescanning())
|
||||||
{
|
{
|
||||||
new AfterDirectoryInitializationRunner().run(mContext, false, () ->
|
new AfterDirectoryInitializationRunner().run(mContext, false, () ->
|
||||||
{
|
{
|
||||||
|
|
|
@ -71,14 +71,14 @@ public final class TvMainActivity extends FragmentActivity
|
||||||
{
|
{
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
mPresenter.onResume();
|
|
||||||
|
|
||||||
if (DirectoryInitialization.shouldStart(this))
|
if (DirectoryInitialization.shouldStart(this))
|
||||||
{
|
{
|
||||||
DirectoryInitialization.start(this);
|
DirectoryInitialization.start(this);
|
||||||
GameFileCacheService.startLoad(this);
|
GameFileCacheService.startLoad(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mPresenter.onResume();
|
||||||
|
|
||||||
// In case the user changed a setting that affects how games are displayed,
|
// In case the user changed a setting that affects how games are displayed,
|
||||||
// such as system language, cover downloading...
|
// such as system language, cover downloading...
|
||||||
refetchMetadata();
|
refetchMetadata();
|
||||||
|
|
Loading…
Reference in New Issue