diff --git a/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt index 2c270656..46872559 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/AddSourceOptionsActivity.kt @@ -16,6 +16,7 @@ class AddSourceOptionsActivity : AppCompatActivity() { lateinit var _buttonBack: ImageButton; lateinit var _buttonQR: BigButton; + lateinit var _buttonBrowse: BigButton; lateinit var _buttonURL: BigButton; lateinit var _buttonPlugins: BigButton; @@ -56,6 +57,7 @@ class AddSourceOptionsActivity : AppCompatActivity() { _buttonBack = findViewById(R.id.button_back); _buttonQR = findViewById(R.id.option_qr); + _buttonBrowse = findViewById(R.id.option_browse); _buttonURL = findViewById(R.id.option_url); _buttonPlugins = findViewById(R.id.option_plugins); @@ -74,6 +76,9 @@ class AddSourceOptionsActivity : AppCompatActivity() { integrator.setCaptureActivity(QRCaptureActivity::class.java); _qrCodeResultLauncher.launch(integrator.createScanIntent()) } + _buttonBrowse.onClick.subscribe { + startActivity(MainActivity.getTabIntent(this, "BROWSE_PLUGINS")); + } _buttonURL.onClick.subscribe { UIDialogs.toast(this, getString(R.string.not_implemented_yet)); diff --git a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt index b1f74e13..ffa86cf5 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt @@ -535,6 +535,9 @@ class MainActivity : AppCompatActivity, IWithResultLauncher { navigate(_fragMainSources); } }; + "BROWSE_PLUGINS" -> { + navigate(_fragBrowser, "https://plugins.grayjay.app"); + } } } } diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt index a907a76b..7f39165e 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/HomeFragment.kt @@ -157,9 +157,12 @@ class HomeFragment : MainFragment() { val dp10 = 10.dp(resources); val dp30 = 30.dp(resources); - if(!StatePlatform.instance.getEnabledClients().isEmpty()) + val pluginsExist = StatePlatform.instance.getAvailableClients().isNotEmpty(); + if(StatePlatform.instance.getEnabledClients().isEmpty()) //Initial setup - return NoResultsView(context, "You have no Sources", "Enable or install some sources", R.drawable.ic_sources, + return NoResultsView(context, "No enabled Sources", if(pluginsExist) + "Enable or install some Sources" + else "This Grayjay version comes without any sources, install sources externally or using the button below.", R.drawable.ic_sources, listOf(BigButton(context, "Browse Online Sources", "View official sources online", R.drawable.ic_explore) { fragment.navigate(BrowserFragment.NavigateOptions("https://plugins.grayjay.app/", mapOf( Pair("grayjay") { req -> @@ -170,7 +173,10 @@ class HomeFragment : MainFragment() { }; } ))); - }.withMargin(dp10, dp30).withBackground(R.drawable.background_big_primary)) + }.withMargin(dp10, dp30), + if(pluginsExist) BigButton(context, "Sources", "Go to the sources tab", R.drawable.ic_creators) { + fragment.navigate(); + }.withMargin(dp10, dp30) else null).filterNotNull() ); else return NoResultsView(context, "Nothing to see here", "The enabled sources do not have any results.", R.drawable.ic_help, diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SourceDetailFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SourceDetailFragment.kt index c9b784fb..1c5b50a4 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SourceDetailFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/main/SourceDetailFragment.kt @@ -295,17 +295,24 @@ class SourceDetailFragment : MainFragment() { } } + val isEmbedded = StatePlugins.instance.getEmbeddedSources(context).any { it.key == config.id }; + val clientIfExists = if(config.id != StateDeveloper.DEV_ID) StatePlugins.instance.getPlugin(config.id); else null; groups.add( BigButtonGroup(c, context.getString(R.string.management), - BigButton(c, context.getString(R.string.uninstall), context.getString(R.string.removes_the_plugin_from_the_app), R.drawable.ic_block) { + if(!isEmbedded) BigButton(c, context.getString(R.string.uninstall), context.getString(R.string.removes_the_plugin_from_the_app), R.drawable.ic_block) { uninstallSource(); }.withBackground(R.drawable.background_big_button_red).apply { this.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT).apply { setMargins(0, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5f, resources.displayMetrics).toInt(), 0, 0); }; + } else BigButton(c, context.getString(R.string.uninstall), "Cannot uninstall embedded plugins", R.drawable.ic_block, {}).apply { + this.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT).apply { + setMargins(0, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5f, resources.displayMetrics).toInt(), 0, 0); + }; + this.alpha = 0.5f }, if(clientIfExists?.captchaEncrypted != null) BigButton(c, context.getString(R.string.delete_captcha), context.getString(R.string.deletes_stored_captcha_answer_for_this_plugin), R.drawable.ic_block) { @@ -325,7 +332,6 @@ class SourceDetailFragment : MainFragment() { _sourceButtons.addView(group); } - val isEmbedded = StatePlugins.instance.getEmbeddedSources(context).any { it.key == config.id }; val advancedButtons = BigButtonGroup(c, "Advanced", BigButton(c, "Edit Code", "Modify the source of this plugin", R.drawable.ic_code) { @@ -333,9 +339,15 @@ class SourceDetailFragment : MainFragment() { this.alpha = 0.5f; }, if(isEmbedded) BigButton(c, "Reinstall", "Modify the source of this plugin", R.drawable.ic_refresh) { - StatePlugins.instance.updateEmbeddedPlugins(context, listOf(config.id), true); - reloadSource(config.id); - UIDialogs.toast(context, "Embedded plugin reinstalled, may require refresh"); + val embeddedConfig = StatePlugins.instance.getEmbeddedPluginConfigFromID(context, config.id); + + UIDialogs.showDialog(context, R.drawable.ic_warning_yellow, "Are you sure you want to downgrade (${config.version}=>${embeddedConfig?.version})?", + "This will revert the plugin back to the originally embedded version.\nVersion change: ${config.version}=>${embeddedConfig?.version}", null, + 0, UIDialogs.Action("Cancel", {}), UIDialogs.Action("Reinstall", { + StatePlugins.instance.updateEmbeddedPlugins(context, listOf(config.id), true); + reloadSource(config.id); + UIDialogs.toast(context, "Embedded plugin reinstalled, may require refresh"); + }, UIDialogs.ActionStyle.DANGEROUS)); }.apply { this.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT).apply { setMargins(0, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5f, resources.displayMetrics).toInt(), 0, 0); diff --git a/app/src/main/java/com/futo/platformplayer/states/StatePlugins.kt b/app/src/main/java/com/futo/platformplayer/states/StatePlugins.kt index 34848c1d..7eefeddb 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StatePlugins.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StatePlugins.kt @@ -160,6 +160,13 @@ class StatePlugins { val configJson = StateAssets.readAsset(context, assetConfigPath) ?: return null; return SourcePluginConfig.fromJson(configJson, ""); } + fun getEmbeddedPluginConfigFromID(context: Context, pluginId: String): SourcePluginConfig? { + val embedded = getEmbeddedSources(context); + if(!embedded.containsKey(pluginId)) + return null; + return getEmbeddedPluginConfig(context, embedded[pluginId]!!); + } + fun installEmbeddedPlugin(context: Context, assetConfigPath: String, id: String? = null): Boolean { try { val configJson = StateAssets.readAsset(context, assetConfigPath) ?: diff --git a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt index df3a24fb..232c4cb0 100644 --- a/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt +++ b/app/src/main/java/com/futo/platformplayer/views/video/FutoVideoPlayer.kt @@ -691,7 +691,7 @@ class FutoVideoPlayer : FutoVideoPlayerBase { val viewWidth = Math.min(metrics.widthPixels, metrics.heightPixels); //TODO: Get parent width. was this.width val deviceHeight = Math.max(metrics.widthPixels, metrics.heightPixels); - val maxHeight = deviceHeight * 0.6; + val maxHeight = deviceHeight * 0.4; val determinedHeight = if(w > h) ((h * (viewWidth.toDouble() / w)).toInt()) diff --git a/app/src/main/res/layout/activity_add_source_options.xml b/app/src/main/res/layout/activity_add_source_options.xml index b3a7f8d6..28752940 100644 --- a/app/src/main/res/layout/activity_add_source_options.xml +++ b/app/src/main/res/layout/activity_add_source_options.xml @@ -55,6 +55,15 @@ app:buttonText="@string/install_by_qr" app:buttonSubText="@string/install_a_plugin_by_scanning_a_qr_code" app:buttonIcon="@drawable/ic_qr" /> +