From e6d8694cbecec742fab5bdabf0fad9a37a4629e7 Mon Sep 17 00:00:00 2001 From: Charles Lombardo Date: Sat, 3 Jun 2023 22:24:02 -0400 Subject: [PATCH] Android: Convert AppLinkActivity to Kotlin --- .../activities/AppLinkActivity.java | 128 ------------------ .../dolphinemu/activities/AppLinkActivity.kt | 104 ++++++++++++++ 2 files changed, 104 insertions(+), 128 deletions(-) delete mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.java create mode 100644 Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.kt diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.java deleted file mode 100644 index 924b5911c0..0000000000 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.java +++ /dev/null @@ -1,128 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later - -package org.dolphinemu.dolphinemu.activities; - -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.util.Log; - -import androidx.fragment.app.FragmentActivity; - -import org.dolphinemu.dolphinemu.model.GameFile; -import org.dolphinemu.dolphinemu.services.GameFileCacheManager; -import org.dolphinemu.dolphinemu.ui.main.TvMainActivity; -import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner; -import org.dolphinemu.dolphinemu.utils.AppLinkHelper; -import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; - -/** - * Linker between leanback homescreen and app - */ -public class AppLinkActivity extends FragmentActivity -{ - private static final String TAG = "AppLinkActivity"; - - private AppLinkHelper.PlayAction playAction; - private AfterDirectoryInitializationRunner mAfterDirectoryInitializationRunner; - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - Intent intent = getIntent(); - Uri uri = intent.getData(); - - Log.v(TAG, uri.toString()); - - if (uri.getPathSegments().isEmpty()) - { - Log.e(TAG, "Invalid uri " + uri); - finish(); - return; - } - - AppLinkHelper.AppLinkAction action = AppLinkHelper.extractAction(uri); - switch (action.getAction()) - { - case AppLinkHelper.PLAY: - playAction = (AppLinkHelper.PlayAction) action; - initResources(); - break; - case AppLinkHelper.BROWSE: - browse(); - break; - default: - throw new IllegalArgumentException("Invalid Action " + action); - } - } - - /** - * Need to init these since they usually occur in the main activity. - */ - private void initResources() - { - mAfterDirectoryInitializationRunner = new AfterDirectoryInitializationRunner(); - mAfterDirectoryInitializationRunner.runWithLifecycle(this, () -> tryPlay(playAction)); - - GameFileCacheManager.isLoading().observe(this, (isLoading) -> - { - if (!isLoading && DirectoryInitialization.areDolphinDirectoriesReady()) - { - tryPlay(playAction); - } - }); - - DirectoryInitialization.start(this); - GameFileCacheManager.startLoad(); - } - - /** - * Action if channel icon is selected - */ - private void browse() - { - Intent openApp = new Intent(this, TvMainActivity.class); - startActivity(openApp); - - finish(); - } - - private void tryPlay(AppLinkHelper.PlayAction action) - { - // 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 = 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 || !GameFileCacheManager.isLoading().getValue()) - { - play(action, game); - } - } - - /** - * Action if program(game) is selected - */ - private void play(AppLinkHelper.PlayAction action, GameFile game) - { - Log.d(TAG, "Playing game " - + action.getGameId() - + " from channel " - + action.getChannelId()); - - if (game == null) - Log.e(TAG, "Invalid Game: " + action.getGameId()); - else - startGame(game); - finish(); - } - - private void startGame(GameFile game) - { - mAfterDirectoryInitializationRunner.cancel(); - EmulationActivity.launch(this, GameFileCacheManager.findSecondDiscAndGetPaths(game), false); - } -} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.kt new file mode 100644 index 0000000000..f3f318202e --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/AppLinkActivity.kt @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.activities + +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.FragmentActivity +import org.dolphinemu.dolphinemu.model.GameFile +import org.dolphinemu.dolphinemu.services.GameFileCacheManager +import org.dolphinemu.dolphinemu.ui.main.TvMainActivity +import org.dolphinemu.dolphinemu.utils.AfterDirectoryInitializationRunner +import org.dolphinemu.dolphinemu.utils.AppLinkHelper +import org.dolphinemu.dolphinemu.utils.AppLinkHelper.PlayAction +import org.dolphinemu.dolphinemu.utils.DirectoryInitialization + +/** + * Linker between leanback homescreen and app + */ +class AppLinkActivity : FragmentActivity() { + private lateinit var playAction: PlayAction + private lateinit var afterDirectoryInitializationRunner: AfterDirectoryInitializationRunner + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val uri = intent.data!! + + Log.v(TAG, uri.toString()) + + if (uri.pathSegments.isEmpty()) { + Log.e(TAG, "Invalid uri $uri") + finish() + return + } + + val action = AppLinkHelper.extractAction(uri) + when (action.action) { + AppLinkHelper.PLAY -> { + playAction = action as PlayAction + initResources() + } + + AppLinkHelper.BROWSE -> browse() + else -> throw IllegalArgumentException("Invalid Action $action") + } + } + + /** + * Need to init these since they usually occur in the main activity. + */ + private fun initResources() { + afterDirectoryInitializationRunner = AfterDirectoryInitializationRunner() + afterDirectoryInitializationRunner.runWithLifecycle(this) { tryPlay(playAction) } + + GameFileCacheManager.isLoading().observe(this) { isLoading: Boolean? -> + if (!isLoading!! && DirectoryInitialization.areDolphinDirectoriesReady()) { + tryPlay(playAction) + } + } + + DirectoryInitialization.start(this) + GameFileCacheManager.startLoad() + } + + /** + * Action if channel icon is selected + */ + private fun browse() { + val openApp = Intent(this, TvMainActivity::class.java) + startActivity(openApp) + + finish() + } + + private fun tryPlay(action: PlayAction) { + // 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. + val game = GameFileCacheManager.getGameFileByGameId(action.gameId) + + // 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 || !GameFileCacheManager.isLoading().value!!) { + play(action, game) + } + } + + /** + * Action if program(game) is selected + */ + private fun play(action: PlayAction, game: GameFile?) { + Log.d(TAG, "Playing game ${action.gameId} from channel ${action.channelId}") + game?.let { startGame(it) } ?: Log.e(TAG, "Invalid Game: " + action.gameId) + finish() + } + + private fun startGame(game: GameFile) { + afterDirectoryInitializationRunner.cancel() + EmulationActivity.launch(this, GameFileCacheManager.findSecondDiscAndGetPaths(game), false) + } + + companion object { + private const val TAG = "AppLinkActivity" + } +}