feat: trickplay on gesture

This commit is contained in:
nomadics9 2024-06-30 22:48:36 +03:00
parent ed69473e26
commit 9baa84e1e7
9 changed files with 67 additions and 4 deletions

2
.gitignore vendored
View file

@ -16,7 +16,7 @@ captures/
*.apk *.apk
*.dm *.dm
output.json output.json
output-metadata.json app/phone/libre/release/output-metadata.json
# IntelliJ # IntelliJ
*.iml *.iml

View file

@ -146,6 +146,10 @@ class PlayerActivity : BasePlayerActivity() {
it.currentTrickplay = currentTrickplay it.currentTrickplay = currentTrickplay
} }
playerGestureHelper?.let {
it.currentTrickplay = currentTrickplay
}
// Chapters // Chapters
if (appPreferences.showChapterMarkers && currentChapters != null) { if (appPreferences.showChapterMarkers && currentChapters != null) {
currentChapters?.let { chapters -> currentChapters?.let { chapters ->

View file

@ -2,6 +2,7 @@ package com.nomadics9.ananas.utils
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.res.Resources import android.content.res.Resources
import android.graphics.Bitmap
import android.media.AudioManager import android.media.AudioManager
import android.os.Build import android.os.Build
import android.os.SystemClock import android.os.SystemClock
@ -19,15 +20,20 @@ import android.view.animation.DecelerateInterpolator
import android.widget.ImageView import android.widget.ImageView
import androidx.media3.ui.AspectRatioFrameLayout import androidx.media3.ui.AspectRatioFrameLayout
import androidx.media3.ui.PlayerView import androidx.media3.ui.PlayerView
import coil.transform.RoundedCornersTransformation
import com.nomadics9.ananas.AppPreferences import com.nomadics9.ananas.AppPreferences
import com.nomadics9.ananas.Constants import com.nomadics9.ananas.Constants
import com.nomadics9.ananas.PlayerActivity import com.nomadics9.ananas.PlayerActivity
import com.nomadics9.ananas.isControlsLocked import com.nomadics9.ananas.isControlsLocked
import com.nomadics9.ananas.models.PlayerChapter import com.nomadics9.ananas.models.PlayerChapter
import com.nomadics9.ananas.models.Trickplay
import com.nomadics9.ananas.mpv.MPVPlayer import com.nomadics9.ananas.mpv.MPVPlayer
import timber.log.Timber import timber.log.Timber
import kotlin.math.abs import kotlin.math.abs
import kotlinx.coroutines.Dispatchers
import coil.load
class PlayerGestureHelper( class PlayerGestureHelper(
private val appPreferences: AppPreferences, private val appPreferences: AppPreferences,
private val activity: PlayerActivity, private val activity: PlayerActivity,
@ -62,6 +68,10 @@ class PlayerGestureHelper(
private val screenWidth = Resources.getSystem().displayMetrics.widthPixels private val screenWidth = Resources.getSystem().displayMetrics.widthPixels
private val screenHeight = Resources.getSystem().displayMetrics.heightPixels private val screenHeight = Resources.getSystem().displayMetrics.heightPixels
var currentTrickplay: Trickplay? = null
private val roundedCorners = RoundedCornersTransformation(10f)
private var currentBitMap: Bitmap? = null
private var currentNumberOfPointers: Int = 0 private var currentNumberOfPointers: Int = 0
private val tapGestureDetector = GestureDetector( private val tapGestureDetector = GestureDetector(
@ -265,6 +275,13 @@ class PlayerGestureHelper(
activity.binding.progressScrubberLayout.visibility = View.VISIBLE activity.binding.progressScrubberLayout.visibility = View.VISIBLE
activity.binding.progressScrubberText.text = "${longToTimestamp(difference)} [${longToTimestamp(newPos, true)}]" activity.binding.progressScrubberText.text = "${longToTimestamp(difference)} [${longToTimestamp(newPos, true)}]"
swipeGestureValueTrackerProgress = newPos swipeGestureValueTrackerProgress = newPos
if (currentTrickplay != null) {
onMove(newPos)
} else {
activity.binding.imagePreviewGesture.visibility = View.GONE
}
swipeGestureProgressOpen = true swipeGestureProgressOpen = true
true true
} else { } else {
@ -471,11 +488,28 @@ class PlayerGestureHelper(
return false return false
} }
fun onMove(position: Long) {
val trickplay = currentTrickplay ?: return
val image = trickplay.images[position.div(trickplay.interval).toInt()]
if (currentBitMap != image) {
activity.binding.imagePreviewGesture.load(image) {
dispatcher(Dispatchers.Main.immediate)
transformations(roundedCorners)
}
currentBitMap = image
}
}
init { init {
if (appPreferences.playerBrightnessRemember) { if (appPreferences.playerBrightnessRemember) {
activity.window.attributes.screenBrightness = appPreferences.playerBrightness activity.window.attributes.screenBrightness = appPreferences.playerBrightness
} }
if (!appPreferences.playerTrickPlayGesture) {
activity.binding.imagePreviewGesture.visibility = View.GONE
}
updateZoomMode(appPreferences.playerStartMaximized) updateZoomMode(appPreferences.playerStartMaximized)
@Suppress("ClickableViewAccessibility") @Suppress("ClickableViewAccessibility")

View file

@ -16,8 +16,11 @@
<LinearLayout <LinearLayout
android:id="@+id/progress_scrubber_layout" android:id="@+id/progress_scrubber_layout"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="64dp"
android:padding="10dp"
android:background="@drawable/overlay_background" android:background="@drawable/overlay_background"
android:clickable="false" android:clickable="false"
android:gravity="center" android:gravity="center"
@ -25,10 +28,20 @@
android:visibility="gone" android:visibility="gone"
tools:visibility="visible"> tools:visibility="visible">
<ImageView
android:id="@+id/image_preview_gesture"
android:layout_width="272dp"
android:layout_height="153dp"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:contentDescription="@string/player_trickplay" />
<TextView <TextView
android:id="@+id/progress_scrubber_text" android:id="@+id/progress_scrubber_text"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center"
android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall" android:textAppearance="@style/TextAppearance.Material3.HeadlineSmall"
android:textColor="@android:color/white" android:textColor="@android:color/white"
tools:text="+00:00:10 [00:00:20]" /> tools:text="+00:00:10 [00:00:20]" />

View file

@ -1,7 +1,7 @@
import org.gradle.api.JavaVersion import org.gradle.api.JavaVersion
object Versions { object Versions {
const val appCode = 3 const val appCode = 4
const val appName = "0.14.2" const val appName = "0.14.2"
const val compileSdk = 34 const val compileSdk = 34

View file

@ -193,4 +193,6 @@
<string name="add_to_favorites">Add to favorites</string> <string name="add_to_favorites">Add to favorites</string>
<string name="remove_from_favorites">Remove from favorites</string> <string name="remove_from_favorites">Remove from favorites</string>
<string name="alaskarTV_requests">AlaskarTV Requests</string> <string name="alaskarTV_requests">AlaskarTV Requests</string>
<string name="pref_player_trickplay_gesture">Trick Play in seek gesture</string>
<string name="pref_player_trickplay_gesture_summary">Requires \'Seek gesture\' and \'Trick Play\'</string>
</resources> </resources>

View file

@ -103,6 +103,14 @@
app:title="@string/pref_player_trickplay" app:title="@string/pref_player_trickplay"
app:widgetLayout="@layout/preference_material3_switch" /> app:widgetLayout="@layout/preference_material3_switch" />
<SwitchPreferenceCompat
app:defaultValue="true"
app:dependency="pref_player_trickplay"
app:key="pref_player_trick_play_gesture"
app:summary="@string/pref_player_trickplay_gesture_summary"
app:title="@string/pref_player_trickplay_gesture"
app:widgetLayout="@layout/preference_material3_switch" />
<SwitchPreferenceCompat <SwitchPreferenceCompat
app:defaultValue="true" app:defaultValue="true"
app:key="pref_player_chapter_markers" app:key="pref_player_chapter_markers"

View file

@ -79,6 +79,7 @@ constructor(
val playerMpvAo get() = sharedPreferences.getString(Constants.PREF_PLAYER_MPV_AO, "audiotrack")!! val playerMpvAo get() = sharedPreferences.getString(Constants.PREF_PLAYER_MPV_AO, "audiotrack")!!
val playerIntroSkipper get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_INTRO_SKIPPER, true) val playerIntroSkipper get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_INTRO_SKIPPER, true)
val playerTrickplay get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_TRICKPLAY, true) val playerTrickplay get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_TRICKPLAY, true)
val playerTrickPlayGesture get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_TRICKPLAY_GESTURE, true)
val showChapterMarkers get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_CHAPTER_MARKERS, true) val showChapterMarkers get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_CHAPTER_MARKERS, true)
val playerPipGesture get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_PIP_GESTURE, false) val playerPipGesture get() = sharedPreferences.getBoolean(Constants.PREF_PLAYER_PIP_GESTURE, false)

View file

@ -28,6 +28,7 @@ object Constants {
const val PREF_PLAYER_MPV_AO = "pref_player_mpv_ao" const val PREF_PLAYER_MPV_AO = "pref_player_mpv_ao"
const val PREF_PLAYER_INTRO_SKIPPER = "pref_player_intro_skipper" const val PREF_PLAYER_INTRO_SKIPPER = "pref_player_intro_skipper"
const val PREF_PLAYER_TRICKPLAY = "pref_player_trickplay" const val PREF_PLAYER_TRICKPLAY = "pref_player_trickplay"
const val PREF_PLAYER_TRICKPLAY_GESTURE = "pref_player_trickplay_gesture"
const val PREF_PLAYER_CHAPTER_MARKERS = "pref_player_chapter_markers" const val PREF_PLAYER_CHAPTER_MARKERS = "pref_player_chapter_markers"
const val PREF_PLAYER_PIP_GESTURE = "pref_player_picture_in_picture_gesture" const val PREF_PLAYER_PIP_GESTURE = "pref_player_picture_in_picture_gesture"
const val PREF_AUDIO_LANGUAGE = "pref_audio_language" const val PREF_AUDIO_LANGUAGE = "pref_audio_language"