Skip to content

Commit

Permalink
Merge pull request #104 from damontecres/ui/minor-fixes
Browse files Browse the repository at this point in the history
Minor UI & bug fixes
  • Loading branch information
damontecres authored Feb 14, 2024
2 parents 938acfc + 77e380f commit 1b96f16
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@ class MainFragment : BrowseSupportFragment() {

private fun getCurrentPosition(): Position? {
val rowPos = selectedPosition
if (rowPos >= 0) {
if (rowPos >= 0 && selectedRowViewHolder != null) {
val columnPos =
(selectedRowViewHolder as ListRowPresenter.ViewHolder).gridView.selectedPosition
if (columnPos >= 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.github.damontecres.stashapp

import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
Expand Down Expand Up @@ -37,6 +38,9 @@ class MainTitleView(context: Context, attrs: AttributeSet) :
val onFocusChangeListener = StashOnFocusChangeListener(context)
mSearchOrbView.onFocusChangeListener = onFocusChangeListener
mPreferencesView.onFocusChangeListener = onFocusChangeListener
mSearchOrbView.enableOrbColorAnimation(false)
mSearchOrbView.orbColor = Color.TRANSPARENT

val scenesButton = root.findViewById<Button>(R.id.scenes_button)
scenesButton.setOnClickListener {
val intent = Intent(context, FilterListActivity::class.java)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,15 @@ import com.github.damontecres.stashapp.util.MutationEngine
import com.github.damontecres.stashapp.util.ServerPreferences
import com.github.damontecres.stashapp.util.StashCoroutineExceptionHandler
import com.github.damontecres.stashapp.util.StashPreviewLoader
import com.github.damontecres.stashapp.util.createOkHttpClient
import com.github.rubensousa.previewseekbar.PreviewBar
import com.github.rubensousa.previewseekbar.media3.PreviewTimeBar
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import okhttp3.Request
import java.util.concurrent.atomic.AtomicBoolean
import kotlin.time.DurationUnit
import kotlin.time.toDuration
Expand Down Expand Up @@ -149,19 +153,21 @@ class PlaybackExoFragment :
exoPlayer.setMediaItem(mediaItem)
exoPlayer.playWhenReady = true
exoPlayer.prepare()
videoView.hideController()
exoPlayer.addListener(
object : Player.Listener {
private var initialSeek = true

override fun onAvailableCommandsChanged(availableCommands: Player.Commands) {
if (initialSeek && position > 0 && Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM in availableCommands) {
exoPlayer.seekTo(position)
initialSeek = false
if (videoView.controllerShowTimeoutMs > 0) {
videoView.hideController()
}
if (position > 0) {
exoPlayer.addListener(
object : Player.Listener {
override fun onAvailableCommandsChanged(availableCommands: Player.Commands) {
if (Player.COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM in availableCommands) {
exoPlayer.seekTo(position)
exoPlayer.removeListener(this)
}
}
}
},
)
},
)
}
}
}

Expand All @@ -186,6 +192,18 @@ class PlaybackExoFragment :

videoView = view.findViewById(R.id.video_view)
videoView.controllerShowTimeoutMs = controllerShowTimeoutMs
videoView.setControllerVisibilityListener(
PlayerView.ControllerVisibilityListener {
val visStr =
when (it) {
View.VISIBLE -> "VISIBLE"
View.INVISIBLE -> "INVISIBLE"
View.GONE -> "GONE"
else -> it.toString()
}
Log.v(TAG, "ControllerVisibilityListener visibility=$visStr")
},
)

val mFocusedZoom =
requireContext().resources.getFraction(
Expand Down Expand Up @@ -233,35 +251,50 @@ class PlaybackExoFragment :
val previewImageView = view.findViewById<ImageView>(R.id.video_preview_image_view)
previewTimeBar = view.findViewById(R.id.exo_progress)

if (scene.spriteUrl != null) {
previewTimeBar.isPreviewEnabled = true
previewTimeBar.setPreviewLoader(
StashPreviewLoader(
requireContext(),
previewImageView,
scene,
),
)
previewTimeBar.addOnScrubListener(
object : PreviewBar.OnScrubListener {
override fun onScrubStart(previewBar: PreviewBar) {
player!!.playWhenReady = false
}
previewTimeBar.isPreviewEnabled = false
previewTimeBar.addOnScrubListener(
object : PreviewBar.OnScrubListener {
override fun onScrubStart(previewBar: PreviewBar) {
player!!.playWhenReady = false
}

override fun onScrubMove(
previewBar: PreviewBar,
progress: Int,
fromUser: Boolean,
) {
}
override fun onScrubMove(
previewBar: PreviewBar,
progress: Int,
fromUser: Boolean,
) {
}

override fun onScrubStop(previewBar: PreviewBar) {
player!!.playWhenReady = true
override fun onScrubStop(previewBar: PreviewBar) {
player!!.playWhenReady = true
}
},
)

if (scene.spriteUrl != null) {
// Usually even if not null, there may not be sprites and the server will return a 404
viewLifecycleOwner.lifecycleScope.launch(StashCoroutineExceptionHandler()) {
withContext(Dispatchers.IO) {
val client = createOkHttpClient(requireContext())
val request = Request.Builder().url(scene.spriteUrl!!).get().build()
client.newCall(request).execute().use {
Log.d(
TAG,
"Sprite URL check isSuccessful=${it.isSuccessful}, code=${it.code}",
)
if (it.isSuccessful) {
previewTimeBar.isPreviewEnabled = true
previewTimeBar.setPreviewLoader(
StashPreviewLoader(
requireContext(),
previewImageView,
scene,
),
)
}
}
},
)
} else {
previewTimeBar.isPreviewEnabled = false
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import androidx.leanback.widget.DetailsOverviewRow
import androidx.leanback.widget.FullWidthDetailsOverviewRowPresenter
import androidx.leanback.widget.FullWidthDetailsOverviewSharedElementHelper
import androidx.leanback.widget.HeaderItem
import androidx.leanback.widget.ImageCardView
import androidx.leanback.widget.ListRow
import androidx.leanback.widget.ListRowPresenter
import androidx.leanback.widget.OnActionClickedListener
Expand All @@ -42,12 +43,15 @@ import com.github.damontecres.stashapp.api.fragment.TagData
import com.github.damontecres.stashapp.data.DataType
import com.github.damontecres.stashapp.data.OCounter
import com.github.damontecres.stashapp.data.Scene
import com.github.damontecres.stashapp.presenters.ActionPresenter
import com.github.damontecres.stashapp.presenters.DetailsDescriptionPresenter
import com.github.damontecres.stashapp.presenters.MarkerPresenter
import com.github.damontecres.stashapp.presenters.OCounterPresenter
import com.github.damontecres.stashapp.presenters.PerformerPresenter
import com.github.damontecres.stashapp.presenters.ScenePresenter
import com.github.damontecres.stashapp.presenters.StashPresenter
import com.github.damontecres.stashapp.presenters.TagPresenter
import com.github.damontecres.stashapp.util.Constants
import com.github.damontecres.stashapp.util.MutationEngine
import com.github.damontecres.stashapp.util.QueryEngine
import com.github.damontecres.stashapp.util.ServerPreferences
Expand All @@ -68,7 +72,13 @@ class VideoDetailsFragment : DetailsSupportFragment() {
private lateinit var performersAdapter: ArrayObjectAdapter
private lateinit var tagsAdapter: ArrayObjectAdapter
private lateinit var markersAdapter: ArrayObjectAdapter
private val sceneActionsAdapter = ArrayObjectAdapter(StashPresenter.SELECTOR)
private val sceneActionsAdapter =
ArrayObjectAdapter(
ClassPresenterSelector().addClassPresenter(
StashAction::class.java,
VideoDetailsActionPresenter(),
).addClassPresenter(OCounter::class.java, OCounterPresenter()),
)

private lateinit var mDetailsBackground: DetailsSupportFragmentBackgroundController
private val mPresenterSelector = ClassPresenterSelector()
Expand Down Expand Up @@ -666,6 +676,19 @@ class VideoDetailsFragment : DetailsSupportFragment() {
)
}

private inner class VideoDetailsActionPresenter : StashPresenter<StashAction>() {
override fun doOnBindViewHolder(
cardView: ImageCardView,
item: StashAction,
) {
cardView.titleText = item.actionName
if (item == StashAction.CREATE_MARKER) {
cardView.contentText = Constants.durationToString(position / 1000.0)
}
cardView.setMainImageDimensions(ActionPresenter.CARD_WIDTH, ActionPresenter.CARD_HEIGHT)
}
}

companion object {
private const val TAG = "VideoDetailsFragment"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ enum class StashAction(val id: Long, val actionName: String) {
ADD_TAG(1L, "Add Tag"),
ADD_PERFORMER(2L, "Add Performer"),
FORCE_TRANSCODE(3L, "Play with Transcoding"),
CREATE_MARKER(4L, "Create Marker from current position"),
CREATE_MARKER(4L, "Create Marker"),
;

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class StashFilterPresenter(callback: LongClickCallBack<Any>? = null) :
cardView: ImageCardView,
item: Any,
) {
setUpExtraRow(cardView)
cardView.titleText = "View All"

val mode: FilterMode =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,18 @@ abstract class StashPresenter<T>(private val callback: LongClickCallBack<T>? = n
view.setInfoAreaBackgroundColor(color)
}

protected fun setUpExtraRow(cardView: View): ViewGroup {
val infoView = cardView.findViewById<ViewGroup>(androidx.leanback.R.id.info_field)
return LayoutInflater.from(infoView.context)
.inflate(R.layout.image_card_extra, infoView, true) as ViewGroup
}

protected fun setUpExtraRow(
cardView: View,
iconMap: EnumMap<DataType, Int>,
oCounter: Int?,
) {
val infoView = cardView.findViewById<ViewGroup>(androidx.leanback.R.id.info_field)
val sceneExtra =
LayoutInflater.from(infoView.context)
.inflate(R.layout.image_card_extra, infoView, true) as ViewGroup
val sceneExtra = setUpExtraRow(cardView)

DataType.entries.forEach {
val count = iconMap[it] ?: -1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import com.github.damontecres.stashapp.api.fragment.SavedFilterData
import com.github.damontecres.stashapp.api.fragment.SlimSceneData
import com.github.damontecres.stashapp.api.type.FindFilterType
import com.github.damontecres.stashapp.data.DataType
import com.github.damontecres.stashapp.util.Constants.STASH_API_HEADER
import okhttp3.OkHttpClient
import java.io.File
import java.security.SecureRandom
Expand Down Expand Up @@ -85,18 +86,33 @@ val TRUST_ALL_CERTS: TrustManager =
}
}

fun createUnsafeOkHttpClient(): OkHttpClient {
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, arrayOf(TRUST_ALL_CERTS), SecureRandom())
return OkHttpClient.Builder()
.sslSocketFactory(
fun createOkHttpClient(context: Context): OkHttpClient {
val trustAll =
PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean("trustAllCerts", false)
val apiKey =
PreferenceManager.getDefaultSharedPreferences(context)
.getString("stashApiKey", null)
val builder = OkHttpClient.Builder()
if (trustAll) {
val sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, arrayOf(TRUST_ALL_CERTS), SecureRandom())
builder.sslSocketFactory(
sslContext.socketFactory,
TRUST_ALL_CERTS as X509TrustManager,
)
.hostnameVerifier { _, _ ->
true
.hostnameVerifier { _, _ ->
true
}
}
if (apiKey.isNotNullOrBlank()) {
builder.addInterceptor {
val request =
it.request().newBuilder().addHeader(STASH_API_HEADER, apiKey.trim()).build()
it.proceed(request)
}
.build()
}
return builder.build()
}

fun configureHttpsTrust(
Expand Down Expand Up @@ -195,7 +211,7 @@ fun createApolloClient(context: Context): ApolloClient? {
.getBoolean("trustAllCerts", false)
val httpEngine =
if (trustAll) {
DefaultHttpEngine(createUnsafeOkHttpClient())
DefaultHttpEngine(createOkHttpClient(context))
} else {
DefaultHttpEngine()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class UnsafeOkHttpGlideModule : AppGlideModule() {
registry.replace<GlideUrl, InputStream>(
GlideUrl::class.java,
InputStream::class.java,
OkHttpUrlLoader.Factory(createUnsafeOkHttpClient()),
OkHttpUrlLoader.Factory(createOkHttpClient(context)),
)
}
}
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/res/layout/video_playback.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
app:animation_enabled="true"
app:scrubber_dragged_size="22dp"
app:played_color="@color/selected_background"
app:use_controller="true" />
app:use_controller="true"
app:hide_during_ads="false" />

</FrameLayout>

0 comments on commit 1b96f16

Please sign in to comment.