mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
Android: Convert AppLinkActivity to Kotlin
This commit is contained in:
parent
cbca383bd2
commit
e6d8694cbe
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user