Skip to content

Commit

Permalink
Automatically hide picture viewer actions after 4 seconds
Browse files Browse the repository at this point in the history
  • Loading branch information
nielsvanvelzen committed Oct 14, 2022
1 parent 962d56e commit b229a99
Showing 1 changed file with 43 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import androidx.core.view.isGone
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
import kotlinx.serialization.decodeFromString
Expand All @@ -28,19 +30,23 @@ import org.jellyfin.sdk.model.constant.ItemSortBy
import org.jellyfin.sdk.model.serializer.toUUIDOrNull
import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
import kotlin.time.Duration.Companion.seconds

class PictureViewerFragment : Fragment(), View.OnKeyListener {
companion object {
const val ARGUMENT_ITEM_ID = "item_id"
const val ARGUMENT_ALBUM_SORT_BY = "album_sort_by"
const val ARGUMENT_ALBUM_SORT_ORDER = "album_sort_order"
const val ARGUMENT_AUTO_PLAY = "auto_play"
private val AUTO_HIDE_ACTIONS_DURATION = 4.seconds
}

private val pictureViewerViewModel by sharedViewModel<PictureViewerViewModel>()
private val api by inject<ApiClient>()
private lateinit var binding: FragmentPictureViewerBinding

private var actionHideTimer: Job? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

Expand All @@ -60,11 +66,25 @@ class PictureViewerFragment : Fragment(), View.OnKeyListener {

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = FragmentPictureViewerBinding.inflate(inflater, container, false)
binding.actionPrevious.setOnClickListener { pictureViewerViewModel.showPrevious() }
binding.actionNext.setOnClickListener { pictureViewerViewModel.showNext() }
binding.actionPlayPause.setOnClickListener { pictureViewerViewModel.togglePresentation() }
binding.actionPrevious.setOnClickListener {
pictureViewerViewModel.showPrevious()
resetHideActionsTimer()
}
binding.actionNext.setOnClickListener {
pictureViewerViewModel.showNext()
resetHideActionsTimer()
}
binding.actionPlayPause.setOnClickListener {
pictureViewerViewModel.togglePresentation()
resetHideActionsTimer()
}
binding.root.setOnClickListener { toggleActions() }
binding.actionPlayPause.requestFocus()
arrayOf(binding.actionPrevious, binding.actionPlayPause, binding.actionNext).forEach {
it.setOnFocusChangeListener { _, _ ->
resetHideActionsTimer()
}
}
return binding.root
}

Expand All @@ -87,7 +107,10 @@ class PictureViewerFragment : Fragment(), View.OnKeyListener {

private val keyHandler = createKeyHandler {
keyDown(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_MEDIA_PAUSE)
.body { pictureViewerViewModel.togglePresentation() }
.body {
pictureViewerViewModel.togglePresentation()
resetHideActionsTimer()
}

keyDown(KeyEvent.KEYCODE_DPAD_LEFT)
.condition { !binding.actions.isVisible }
Expand Down Expand Up @@ -149,6 +172,22 @@ class PictureViewerFragment : Fragment(), View.OnKeyListener {
else showActions()
}

private fun resetHideActionsTimer() {
// Cancel existing timer (if it exists)
actionHideTimer?.cancel()

// Don't start the timer when already invisible
if (!binding.actions.isVisible) return

// Create new timer
actionHideTimer = lifecycleScope.launch {
delay(AUTO_HIDE_ACTIONS_DURATION)

// Only auto-hide when there is an active presenation
if (pictureViewerViewModel.presentationActive.value) hideActions()
}
}

private fun AsyncImageView.load(item: BaseItemDto) {
val url = api.imageApi.getItemImageUrl(
itemId = item.id,
Expand Down

0 comments on commit b229a99

Please sign in to comment.