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