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 @@ + = 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()) } } 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 { 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/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/java/com/futo/platformplayer/views/behavior/GestureControlView.kt b/app/src/main/java/com/futo/platformplayer/views/behavior/GestureControlView.kt index 7e2a223d..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 @@ -3,12 +3,12 @@ package com.futo.platformplayer.views.behavior import android.animation.Animator import android.animation.AnimatorSet import android.animation.ObjectAnimator -import android.app.Activity import android.content.Context import android.graphics.Matrix import android.graphics.drawable.Animatable import android.media.AudioManager import android.util.AttributeSet +import android.util.Log import android.view.GestureDetector import android.view.LayoutInflater import android.view.MotionEvent @@ -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 @@ -67,6 +68,7 @@ class GestureControlView : LinearLayout { private var _animatorSound: ObjectAnimator? = null; private var _brightnessFactor = 1.0f; private var _originalBrightnessFactor = 1.0f; + private var _originalBrightnessMode: Int = 0; private var _adjustingBrightness: Boolean = false; private val _layoutControlsBrightness: FrameLayout; private val _progressBrightness: CircularProgressBar; @@ -168,8 +170,6 @@ class GestureControlView : LinearLayout { if(p0 == null) return false; - Logger.i(TAG, "p0.pointerCount: " + p0.pointerCount) - if (!_isPanning && p1.pointerCount == 1) { val minDistance = Math.min(width, height) if (_isFullScreen && _adjustingBrightness) { @@ -739,16 +739,25 @@ class GestureControlView : LinearLayout { resetZoomPan() if (isFullScreen) { - val c = context - if (c is Activity && Settings.instance.gestureControls.useSystemBrightness) { - _brightnessFactor = c.window.attributes.screenBrightness - if (_brightnessFactor == -1.0f) { - _brightnessFactor = android.provider.Settings.System.getInt( - context.contentResolver, - android.provider.Settings.System.SCREEN_BRIGHTNESS - ) / 255.0f; + if (Settings.instance.gestureControls.useSystemBrightness) { + 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") + + _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") } - _originalBrightnessFactor = _brightnessFactor + } + + if (!Settings.instance.gestureControls.useSystemBrightness) { + _brightnessFactor = 1.0f; } if (Settings.instance.gestureControls.useSystemVolume) { @@ -761,10 +770,19 @@ class GestureControlView : LinearLayout { onBrightnessAdjusted.emit(_brightnessFactor); onSoundAdjusted.emit(_soundFactor); } else { - val c = context - if (c is Activity && Settings.instance.gestureControls.useSystemBrightness) { + if (Settings.instance.gestureControls.useSystemBrightness) { if (Settings.instance.gestureControls.restoreSystemBrightness) { - onBrightnessAdjusted.emit(_originalBrightnessFactor); + onBrightnessAdjusted.emit(_originalBrightnessFactor) + + if (android.provider.Settings.System.canWrite(context)) { + Log.i(TAG, "Restoring system brightness mode _originalBrightnessMode: $_originalBrightnessMode") + + android.provider.Settings.System.putInt( + context.contentResolver, + android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, + _originalBrightnessMode + ) + } } } else { onBrightnessAdjusted.emit(1.0f); 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 232c4cb0..298af4ab 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 @@ -1,18 +1,18 @@ package com.futo.platformplayer.views.video -import android.app.Activity import android.content.Context +import android.content.Intent import android.content.res.Resources import android.graphics.Color import android.graphics.drawable.Drawable import android.media.AudioManager +import android.net.Uri import android.util.AttributeSet import android.util.Log import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.view.WindowManager import android.widget.FrameLayout import android.widget.ImageButton import android.widget.TextView @@ -122,6 +122,7 @@ class FutoVideoPlayer : FutoVideoPlayerBase { private var _currentChapterLoopActive = false; private var _currentChapterLoopId: Int = 0; private var _currentChapter: IChapter? = null; + private var _promptedForPermissions: Boolean = false; //Events @@ -249,11 +250,8 @@ class FutoVideoPlayer : FutoVideoPlayerBase { }; gestureControl.onToggleFullscreen.subscribe { setFullScreen(!isFullScreen) }; gestureControl.onBrightnessAdjusted.subscribe { - if (context is Activity && Settings.instance.gestureControls.useSystemBrightness) { - val window = context.window - val layout: WindowManager.LayoutParams = window.attributes - layout.screenBrightness = it - window.attributes = layout + if (Settings.instance.gestureControls.useSystemBrightness) { + setSystemBrightness(it) } else { if (it == 1.0f) { _overlay_brightness.visibility = View.GONE; @@ -433,6 +431,30 @@ class FutoVideoPlayer : FutoVideoPlayerBase { } } + private fun setSystemBrightness(brightness: Float) { + Log.i(TAG, "setSystemBrightness $brightness") + if (android.provider.Settings.System.canWrite(context)) { + Log.i(TAG, "setSystemBrightness canWrite $brightness") + android.provider.Settings.System.putInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE, android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL); + android.provider.Settings.System.putInt(context.contentResolver, android.provider.Settings.System.SCREEN_BRIGHTNESS, (brightness * 255.0f).toInt().coerceAtLeast(1).coerceAtMost(255)); + } else if (!_promptedForPermissions) { + Log.i(TAG, "setSystemBrightness prompt $brightness") + _promptedForPermissions = true + UIDialogs.showConfirmationDialog(context, "System brightness controls require explicit permission", action = { + openAndroidPermissionsMenu() + }) + } else { + Log.i(TAG, "setSystemBrightness no permission?") + //No permissions but already prompted, ignore + } + } + + private fun openAndroidPermissionsMenu() { + val intent = Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS) + intent.setData(Uri.parse("package:" + context.packageName)) + context.startActivity(intent) + } + fun updateNextPrevious() { val vidPrev = StatePlayer.instance.getPrevQueueItem(true); val vidNext = StatePlayer.instance.getNextQueueItem(true); 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