mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
feat(ui): tap video duration to toggle remaining time counter (#878)
This commit is contained in:
parent
8b14fcb881
commit
3dcf7076d0
5 changed files with 101 additions and 45 deletions
|
@ -163,10 +163,10 @@ dependencies {
|
||||||
// Android Core & Lifecycle
|
// Android Core & Lifecycle
|
||||||
implementation("androidx.core:core-ktx:1.12.0")
|
implementation("androidx.core:core-ktx:1.12.0")
|
||||||
implementation("androidx.appcompat:appcompat:1.6.1")
|
implementation("androidx.appcompat:appcompat:1.6.1")
|
||||||
implementation("androidx.navigation:navigation-ui-ktx:2.7.5")
|
implementation("androidx.navigation:navigation-ui-ktx:2.7.6")
|
||||||
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")
|
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
|
||||||
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
|
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
|
||||||
implementation("androidx.navigation:navigation-fragment-ktx:2.7.5")
|
implementation("androidx.navigation:navigation-fragment-ktx:2.7.6")
|
||||||
|
|
||||||
// Design & UI
|
// Design & UI
|
||||||
implementation("jp.wasabeef:glide-transformations:4.3.0")
|
implementation("jp.wasabeef:glide-transformations:4.3.0")
|
||||||
|
@ -228,8 +228,8 @@ dependencies {
|
||||||
Level 25 or Less. */
|
Level 25 or Less. */
|
||||||
|
|
||||||
// Downloading & Networking
|
// Downloading & Networking
|
||||||
implementation("androidx.work:work-runtime:2.8.1")
|
implementation("androidx.work:work-runtime:2.9.0")
|
||||||
implementation("androidx.work:work-runtime-ktx:2.8.1")
|
implementation("androidx.work:work-runtime-ktx:2.9.0")
|
||||||
implementation("com.github.Blatzar:NiceHttp:0.4.5") // HTTP Lib
|
implementation("com.github.Blatzar:NiceHttp:0.4.5") // HTTP Lib
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,14 +7,13 @@ import android.content.Context
|
||||||
import android.content.pm.ActivityInfo
|
import android.content.pm.ActivityInfo
|
||||||
import android.content.res.ColorStateList
|
import android.content.res.ColorStateList
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.content.res.Resources
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.media.AudioManager
|
import android.media.AudioManager
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.util.DisplayMetrics
|
import android.text.format.DateUtils
|
||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
|
@ -31,11 +30,10 @@ import androidx.core.graphics.blue
|
||||||
import androidx.core.graphics.green
|
import androidx.core.graphics.green
|
||||||
import androidx.core.graphics.red
|
import androidx.core.graphics.red
|
||||||
import androidx.core.view.isGone
|
import androidx.core.view.isGone
|
||||||
|
import androidx.core.view.isInvisible
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.widget.doOnTextChanged
|
import androidx.core.widget.doOnTextChanged
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.getKey
|
|
||||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
|
||||||
import com.lagradost.cloudstream3.CommonActivity.keyEventListener
|
import com.lagradost.cloudstream3.CommonActivity.keyEventListener
|
||||||
import com.lagradost.cloudstream3.CommonActivity.playerEventListener
|
import com.lagradost.cloudstream3.CommonActivity.playerEventListener
|
||||||
import com.lagradost.cloudstream3.CommonActivity.screenHeight
|
import com.lagradost.cloudstream3.CommonActivity.screenHeight
|
||||||
|
@ -48,6 +46,7 @@ import com.lagradost.cloudstream3.ui.player.GeneratorPlayer.Companion.subsProvid
|
||||||
import com.lagradost.cloudstream3.ui.player.source_priority.QualityDataHelper
|
import com.lagradost.cloudstream3.ui.player.source_priority.QualityDataHelper
|
||||||
import com.lagradost.cloudstream3.ui.result.setText
|
import com.lagradost.cloudstream3.ui.result.setText
|
||||||
import com.lagradost.cloudstream3.ui.result.txt
|
import com.lagradost.cloudstream3.ui.result.txt
|
||||||
|
import com.lagradost.cloudstream3.ui.settings.SettingsFragment
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.isUsingMobileData
|
import com.lagradost.cloudstream3.utils.AppUtils.isUsingMobileData
|
||||||
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
import com.lagradost.cloudstream3.utils.DataStoreHelper
|
||||||
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
|
||||||
|
@ -59,10 +58,10 @@ import com.lagradost.cloudstream3.utils.UIHelper.hideSystemUI
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage
|
import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.showSystemUI
|
import com.lagradost.cloudstream3.utils.UIHelper.showSystemUI
|
||||||
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
import com.lagradost.cloudstream3.utils.UIHelper.toPx
|
||||||
|
import com.lagradost.cloudstream3.utils.UserPreferenceDelegate
|
||||||
import com.lagradost.cloudstream3.utils.Vector2
|
import com.lagradost.cloudstream3.utils.Vector2
|
||||||
import kotlin.math.*
|
import kotlin.math.*
|
||||||
|
|
||||||
|
|
||||||
const val MINIMUM_SEEK_TIME = 7000L // when swipe seeking
|
const val MINIMUM_SEEK_TIME = 7000L // when swipe seeking
|
||||||
const val MINIMUM_VERTICAL_SWIPE = 2.0f // in percentage
|
const val MINIMUM_VERTICAL_SWIPE = 2.0f // in percentage
|
||||||
const val MINIMUM_HORIZONTAL_SWIPE = 2.0f // in percentage
|
const val MINIMUM_HORIZONTAL_SWIPE = 2.0f // in percentage
|
||||||
|
@ -79,10 +78,9 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
protected open var lockRotation = true
|
protected open var lockRotation = true
|
||||||
protected open var isFullScreenPlayer = true
|
protected open var isFullScreenPlayer = true
|
||||||
protected open var isTv = false
|
protected open var isTv = false
|
||||||
|
|
||||||
protected var playerBinding: PlayerCustomLayoutBinding? = null
|
protected var playerBinding: PlayerCustomLayoutBinding? = null
|
||||||
|
|
||||||
|
private var durationMode : Boolean by UserPreferenceDelegate("duration_mode", false)
|
||||||
// state of player UI
|
// state of player UI
|
||||||
protected var isShowing = false
|
protected var isShowing = false
|
||||||
protected var isLocked = false
|
protected var isLocked = false
|
||||||
|
@ -1332,15 +1330,6 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
} else false
|
} else false
|
||||||
}
|
}
|
||||||
|
|
||||||
//player_episodes_button?.setOnClickListener {
|
|
||||||
// player_episodes_button?.isGone = true
|
|
||||||
// player_episode_list?.isVisible = true
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//player_episode_list?.adapter = PlayerEpisodeAdapter { click ->
|
|
||||||
//
|
|
||||||
//}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
context?.let { ctx ->
|
context?.let { ctx ->
|
||||||
val settingsManager = PreferenceManager.getDefaultSharedPreferences(ctx)
|
val settingsManager = PreferenceManager.getDefaultSharedPreferences(ctx)
|
||||||
|
@ -1425,12 +1414,21 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logError(e)
|
logError(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
playerBinding?.apply {
|
playerBinding?.apply {
|
||||||
playerPausePlay.setOnClickListener {
|
playerPausePlay.setOnClickListener {
|
||||||
autoHide()
|
autoHide()
|
||||||
player.handleEvent(CSPlayerEvent.PlayPauseToggle)
|
player.handleEvent(CSPlayerEvent.PlayPauseToggle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exoDuration.setOnClickListener {
|
||||||
|
setRemainingTimeCounter(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
timeLeft.setOnClickListener {
|
||||||
|
setRemainingTimeCounter(false)
|
||||||
|
}
|
||||||
|
|
||||||
skipChapterButton.setOnClickListener {
|
skipChapterButton.setOnClickListener {
|
||||||
player.handleEvent(CSPlayerEvent.SkipCurrentChapter)
|
player.handleEvent(CSPlayerEvent.SkipCurrentChapter)
|
||||||
}
|
}
|
||||||
|
@ -1515,32 +1513,14 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
return@setOnTouchListener false
|
return@setOnTouchListener false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// cs3 is peak media center
|
||||||
|
setRemainingTimeCounter(durationMode || SettingsFragment.isTrueTvSettings())
|
||||||
|
playerBinding?.exoPosition?.doOnTextChanged { _, _, _, _ ->
|
||||||
|
updateRemainingTime()
|
||||||
|
}
|
||||||
// init UI
|
// init UI
|
||||||
try {
|
try {
|
||||||
uiReset()
|
uiReset()
|
||||||
|
|
||||||
// init chromecast UI
|
|
||||||
// removed due to having no use and bugging
|
|
||||||
//activity?.let {
|
|
||||||
// if (it.isCastApiAvailable()) {
|
|
||||||
// try {
|
|
||||||
// CastButtonFactory.setUpMediaRouteButton(it, player_media_route_button)
|
|
||||||
// val castContext = CastContext.getSharedInstance(it.applicationContext)
|
|
||||||
//
|
|
||||||
// player_media_route_button?.isGone =
|
|
||||||
// castContext.castState == CastState.NO_DEVICES_AVAILABLE
|
|
||||||
// castContext.addCastStateListener { state ->
|
|
||||||
// player_media_route_button?.isGone =
|
|
||||||
// state == CastState.NO_DEVICES_AVAILABLE
|
|
||||||
// }
|
|
||||||
// } catch (e: Exception) {
|
|
||||||
// logError(e)
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// // if cast is not possible hide UI
|
|
||||||
// player_media_route_button?.isGone = true
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
logError(e)
|
logError(e)
|
||||||
}
|
}
|
||||||
|
@ -1558,6 +1538,24 @@ open class FullScreenPlayer : AbstractPlayerFragment() {
|
||||||
updateOrientation()
|
updateOrientation()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateRemainingTime() {
|
||||||
|
val duration = player.getDuration()
|
||||||
|
val position = player.getPosition()
|
||||||
|
|
||||||
|
if (duration != null && duration > 1 && position != null) {
|
||||||
|
val remainingTimeSeconds = (duration - position + 500) / 1000
|
||||||
|
val formattedTime = "-${DateUtils.formatElapsedTime(remainingTimeSeconds)}"
|
||||||
|
|
||||||
|
playerBinding?.timeLeft?.text = formattedTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setRemainingTimeCounter(showRemaining: Boolean) {
|
||||||
|
durationMode = showRemaining
|
||||||
|
playerBinding?.exoDuration?.isInvisible= showRemaining
|
||||||
|
playerBinding?.timeLeft?.isVisible = showRemaining
|
||||||
|
}
|
||||||
|
|
||||||
private fun dynamicOrientation(): Int {
|
private fun dynamicOrientation(): Int {
|
||||||
return if (autoPlayerRotateEnabled) {
|
return if (autoPlayerRotateEnabled) {
|
||||||
if (isVerticalOrientation) {
|
if (isVerticalOrientation) {
|
||||||
|
|
|
@ -518,6 +518,26 @@
|
||||||
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
tools:text="23:20" />
|
tools:text="23:20" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/time_left"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_gravity="center|center_vertical"
|
||||||
|
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:includeFontPadding="false"
|
||||||
|
android:minWidth="50dp"
|
||||||
|
android:paddingLeft="4dp"
|
||||||
|
android:paddingRight="4dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="normal"
|
||||||
|
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
tools:text="-23:20"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<HorizontalScrollView
|
<HorizontalScrollView
|
||||||
|
|
|
@ -607,6 +607,25 @@
|
||||||
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
tools:text="23:20" />
|
tools:text="23:20" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/time_left"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_gravity="center|center_vertical"
|
||||||
|
|
||||||
|
android:layout_marginEnd="20dp"
|
||||||
|
android:includeFontPadding="false"
|
||||||
|
android:minWidth="50dp"
|
||||||
|
android:paddingLeft="4dp"
|
||||||
|
android:paddingRight="4dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="normal"
|
||||||
|
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
tools:text="-23:20"
|
||||||
|
android:visibility="gone"/>
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -506,6 +506,25 @@
|
||||||
app:layout_constraintEnd_toEndOf="@id/player_fullscreen"
|
app:layout_constraintEnd_toEndOf="@id/player_fullscreen"
|
||||||
tools:text="23:20" />
|
tools:text="23:20" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/time_left"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="30dp"
|
||||||
|
android:layout_gravity="center|center_vertical"
|
||||||
|
|
||||||
|
android:layout_marginEnd="30dp"
|
||||||
|
android:includeFontPadding="false"
|
||||||
|
android:minWidth="50dp"
|
||||||
|
android:paddingLeft="4dp"
|
||||||
|
android:paddingRight="4dp"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="14sp"
|
||||||
|
android:textStyle="normal"
|
||||||
|
app:layout_constraintBaseline_toBaselineOf="@id/exo_position"
|
||||||
|
app:layout_constraintEnd_toEndOf="@id/player_fullscreen"
|
||||||
|
tools:text="-23:20"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
android:id="@+id/player_fullscreen"
|
android:id="@+id/player_fullscreen"
|
||||||
android:layout_width="30dp"
|
android:layout_width="30dp"
|
||||||
|
|
Loading…
Reference in a new issue