From 3bd0aac4f81b72c065a990574079e9caff3561fa Mon Sep 17 00:00:00 2001 From: Koen Date: Fri, 19 Jan 2024 14:09:56 +0100 Subject: [PATCH 1/5] Implemented system brightness in an alternative way. --- app/src/main/AndroidManifest.xml | 1 + .../java/com/futo/platformplayer/Settings.kt | 2 +- .../views/behavior/GestureControlView.kt | 39 ++++++++++++------- .../views/video/FutoVideoPlayer.kt | 36 +++++++++++++---- 4 files changed, 55 insertions(+), 23 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 276e2610..49076988 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ + Date: Fri, 19 Jan 2024 15:16:41 +0100 Subject: [PATCH 2/5] Fixed crash where it would fail to unregister audio noisy receiver. Fixed crash where system brightness setting does not exist. --- .../futo/platformplayer/states/StateApp.kt | 13 +++++++++-- .../views/behavior/GestureControlView.kt | 23 +++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt index d3e2f158..144c1dc9 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt @@ -13,6 +13,7 @@ import android.net.NetworkRequest import android.net.Uri import android.provider.DocumentsContract import android.util.DisplayMetrics +import android.util.Log import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope @@ -473,7 +474,11 @@ class StateApp { Logger.i(TAG, "MainApp Started: Initialize [Noisy]"); _receiverBecomingNoisy?.let { _receiverBecomingNoisy = null; - context.unregisterReceiver(it); + try { + context.unregisterReceiver(it); + } catch (e: Throwable) { + Log.e(TAG, "Failed to unregister receiver.", e) + } } _receiverBecomingNoisy = AudioNoisyReceiver(); context.registerReceiver(_receiverBecomingNoisy, IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)); @@ -639,7 +644,11 @@ class StateApp { Logger.i(TAG, "App ended"); _receiverBecomingNoisy?.let { _receiverBecomingNoisy = null; - context.unregisterReceiver(it); + try { + context.unregisterReceiver(it); + } catch (e: Throwable) { + Log.e(TAG, "Failed to unregister receiver.", e) + } } Logger.i(TAG, "Unregistered network callback on connectivityManager.") diff --git a/app/src/main/java/com/futo/platformplayer/views/behavior/GestureControlView.kt b/app/src/main/java/com/futo/platformplayer/views/behavior/GestureControlView.kt index c37d32aa..966c0586 100644 --- a/app/src/main/java/com/futo/platformplayer/views/behavior/GestureControlView.kt +++ b/app/src/main/java/com/futo/platformplayer/views/behavior/GestureControlView.kt @@ -24,6 +24,7 @@ import androidx.core.animation.doOnStart import androidx.core.view.GestureDetectorCompat import com.futo.platformplayer.R import com.futo.platformplayer.Settings +import com.futo.platformplayer.UIDialogs import com.futo.platformplayer.constructs.Event0 import com.futo.platformplayer.constructs.Event1 import com.futo.platformplayer.constructs.Event2 @@ -739,15 +740,23 @@ class GestureControlView : LinearLayout { if (isFullScreen) { if (Settings.instance.gestureControls.useSystemBrightness) { - _originalBrightnessMode = android.provider.Settings.System.getInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE) + try { + _originalBrightnessMode = android.provider.Settings.System.getInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE) - val brightness = android.provider.Settings.System.getInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS) - _brightnessFactor = brightness / 255.0f; - Log.i(TAG, "Starting brightness brightness: $brightness, _brightnessFactor: $_brightnessFactor, _originalBrightnessMode: $_originalBrightnessMode") + val brightness = android.provider.Settings.System.getInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS) + _brightnessFactor = brightness / 255.0f; + Log.i(TAG, "Starting brightness brightness: $brightness, _brightnessFactor: $_brightnessFactor, _originalBrightnessMode: $_originalBrightnessMode") - _originalBrightnessFactor = _brightnessFactor - android.provider.Settings.System.putInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); - } else { + _originalBrightnessFactor = _brightnessFactor + android.provider.Settings.System.putInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); + } catch (e: Throwable) { + Settings.instance.gestureControls.useSystemBrightness = false + Settings.instance.save() + UIDialogs.toast(context, "useSystemBrightness disabled due to an error") + } + } + + if (!Settings.instance.gestureControls.useSystemBrightness) { _brightnessFactor = 1.0f; } From e4c574db6bdfe753686207cd303d800008b7316c Mon Sep 17 00:00:00 2001 From: Koen Date: Fri, 19 Jan 2024 15:38:22 +0100 Subject: [PATCH 3/5] Fixed crash in updateAllButtonVisibility. --- .../mainactivity/bottombar/MenuBottomBarFragment.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt index 0c3e9c72..cfff5668 100644 --- a/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt +++ b/app/src/main/java/com/futo/platformplayer/fragment/mainactivity/bottombar/MenuBottomBarFragment.kt @@ -246,12 +246,15 @@ class MenuBottomBarFragment : MainActivityFragment() { fun updateAllButtonVisibility() { val defs = currentButtonDefinitions?.toMutableList() ?: return val metrics = StateApp.instance.displayMetrics ?: resources.displayMetrics; - _buttonsVisible = floor(metrics.widthPixels.toDouble() / 65.dp(resources).toDouble()).roundToInt(); - if (_buttonsVisible - 1 >= defs.size) { + _buttonsVisible = floor(metrics.widthPixels.toDouble() / 65.dp(resources).toDouble()).roundToInt() - 1; + if (_buttonsVisible >= defs.size) { updateBottomMenuButtons(defs.toMutableList(), false); + } else if (_buttonsVisible > 0) { + updateBottomMenuButtons(defs.take(_buttonsVisible - 1).toMutableList(), true); + updateMoreButtons(defs.drop(_buttonsVisible - 1).toMutableList()); } else { - updateBottomMenuButtons(defs.slice(IntRange(0, _buttonsVisible - 2)).toMutableList(), true); - updateMoreButtons(defs.slice(IntRange(_buttonsVisible - 1, defs.size - 1)).toMutableList()); + updateBottomMenuButtons(mutableListOf(), false) + updateMoreButtons(defs.toMutableList()) } } From 8ba8e535bdc416d15adca316f776f4f285ba766c Mon Sep 17 00:00:00 2001 From: Koen Date: Fri, 19 Jan 2024 16:13:42 +0100 Subject: [PATCH 4/5] Added check for updates button on exception activity. --- .../java/com/futo/platformplayer/UIDialogs.kt | 6 +++++- .../activities/ExceptionActivity.kt | 15 +++++++++++++++ .../dialogs/AutoUpdateDialog.kt | 5 +++++ .../futo/platformplayer/states/StateUpdate.kt | 4 ++-- .../main/res/layout/activity_exception.xml | 19 ++++++++++++++++--- app/src/main/res/values/strings.xml | 1 + 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/UIDialogs.kt b/app/src/main/java/com/futo/platformplayer/UIDialogs.kt index 0ebf26bd..f0b8abea 100644 --- a/app/src/main/java/com/futo/platformplayer/UIDialogs.kt +++ b/app/src/main/java/com/futo/platformplayer/UIDialogs.kt @@ -304,12 +304,16 @@ class UIDialogs { showDialog(context, R.drawable.ic_error, text, null, null, 0, cancelButtonAction, confirmButtonAction) } - fun showUpdateAvailableDialog(context: Context, lastVersion: Int) { + fun showUpdateAvailableDialog(context: Context, lastVersion: Int, hideExceptionButtons: Boolean = false) { val dialog = AutoUpdateDialog(context); registerDialogOpened(dialog); dialog.setOnDismissListener { registerDialogClosed(dialog) }; dialog.show(); dialog.setMaxVersion(lastVersion); + + if (hideExceptionButtons) { + dialog.hideExceptionButtons() + } } fun showChangelogDialog(context: Context, lastVersion: Int) { diff --git a/app/src/main/java/com/futo/platformplayer/activities/ExceptionActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/ExceptionActivity.kt index 99a6e1b0..c3ba7daa 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/ExceptionActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/ExceptionActivity.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle +import android.view.View import android.widget.LinearLayout import android.widget.TextView import android.widget.Toast @@ -15,6 +16,7 @@ import com.futo.platformplayer.logging.LogLevel import com.futo.platformplayer.logging.Logging import com.futo.platformplayer.setNavigationBarColorAndIcons import com.futo.platformplayer.states.StateApp +import com.futo.platformplayer.states.StateUpdate import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -28,6 +30,7 @@ class ExceptionActivity : AppCompatActivity() { private lateinit var _buttonSubmit: LinearLayout; private lateinit var _buttonRestart: LinearLayout; private lateinit var _buttonClose: LinearLayout; + private lateinit var _buttonCheckForUpdates: LinearLayout; private var _file: File? = null; private var _submitted = false; @@ -45,6 +48,7 @@ class ExceptionActivity : AppCompatActivity() { _buttonSubmit = findViewById(R.id.button_submit); _buttonRestart = findViewById(R.id.button_restart); _buttonClose = findViewById(R.id.button_close); + _buttonCheckForUpdates = findViewById(R.id.button_check_for_updates); val context = intent.getStringExtra(EXTRA_CONTEXT) ?: getString(R.string.unknown_context); val stack = intent.getStringExtra(EXTRA_STACK) ?: getString(R.string.something_went_wrong_missing_stack_trace); @@ -83,6 +87,17 @@ class ExceptionActivity : AppCompatActivity() { _buttonClose.setOnClickListener { finish(); }; + + if (!BuildConfig.IS_PLAYSTORE_BUILD) { + _buttonCheckForUpdates.visibility = View.VISIBLE + _buttonCheckForUpdates.setOnClickListener { + lifecycleScope.launch(Dispatchers.IO) { + StateUpdate.instance.checkForUpdates(this@ExceptionActivity, true, true) + } + } + } else { + _buttonCheckForUpdates.visibility = View.GONE + } } private fun submitFile() { diff --git a/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt b/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt index 3f7fda29..5e2b72de 100644 --- a/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt +++ b/app/src/main/java/com/futo/platformplayer/dialogs/AutoUpdateDialog.kt @@ -96,6 +96,11 @@ class AutoUpdateDialog(context: Context?) : AlertDialog(context) { Logger.i(TAG, "Cleared InstallReceiver.onReceiveResult handler.") } + fun hideExceptionButtons() { + _buttonNever.visibility = View.GONE + _buttonShowChangelog.visibility = View.GONE + } + private fun update() { _buttonShowChangelog.visibility = Button.GONE; _buttonNever.visibility = Button.GONE; diff --git a/app/src/main/java/com/futo/platformplayer/states/StateUpdate.kt b/app/src/main/java/com/futo/platformplayer/states/StateUpdate.kt index 7a625a15..ebc75dd1 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateUpdate.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateUpdate.kt @@ -155,7 +155,7 @@ class StateUpdate { } } - suspend fun checkForUpdates(context: Context, showUpToDateToast: Boolean) = withContext(Dispatchers.IO) { + suspend fun checkForUpdates(context: Context, showUpToDateToast: Boolean, hideExceptionButtons: Boolean = false) = withContext(Dispatchers.IO) { try { val client = ManagedHttpClient(); val latestVersion = downloadVersionCode(client); @@ -167,7 +167,7 @@ class StateUpdate { if (latestVersion > currentVersion) { withContext(Dispatchers.Main) { try { - UIDialogs.showUpdateAvailableDialog(context, latestVersion); + UIDialogs.showUpdateAvailableDialog(context, latestVersion, hideExceptionButtons); } catch (e: Throwable) { UIDialogs.toast(context, "Failed to show update dialog"); Logger.w(TAG, "Error occurred in update dialog."); diff --git a/app/src/main/res/layout/activity_exception.xml b/app/src/main/res/layout/activity_exception.xml index 7f88ba94..eb1a29bb 100644 --- a/app/src/main/res/layout/activity_exception.xml +++ b/app/src/main/res/layout/activity_exception.xml @@ -37,9 +37,22 @@ android:fontFamily="@font/inter_extra_light" /> - + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fabd85da..274feb82 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -749,6 +749,7 @@ Add Creators Select Zoom + Check to see if an update is available. Recommendations Subscriptions From b75217f789634335dc4ce8fa239ff10b24186825 Mon Sep 17 00:00:00 2001 From: Koen Date: Fri, 19 Jan 2024 17:02:24 +0100 Subject: [PATCH 5/5] Possible fix for AudioNoisyReceiver popping up 'App is not responding'. --- .../futo/platformplayer/receivers/AudioNoisyReceiver.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/futo/platformplayer/receivers/AudioNoisyReceiver.kt b/app/src/main/java/com/futo/platformplayer/receivers/AudioNoisyReceiver.kt index a8c3894d..20c35b4e 100644 --- a/app/src/main/java/com/futo/platformplayer/receivers/AudioNoisyReceiver.kt +++ b/app/src/main/java/com/futo/platformplayer/receivers/AudioNoisyReceiver.kt @@ -4,13 +4,18 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import com.futo.platformplayer.logging.Logger +import com.futo.platformplayer.states.StateApp +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch class AudioNoisyReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { - Logger.i(TAG, "Audio Noisy received"); - MediaControlReceiver.onPauseReceived.emit(); + StateApp.instance.scopeOrNull?.launch(Dispatchers.Main) { + Logger.i(TAG, "Audio Noisy received"); + MediaControlReceiver.onPauseReceived.emit(); + } } companion object {