From 35157b78f5684f18b1525d1cf3e34ddbca788a3d Mon Sep 17 00:00:00 2001 From: Jannik Date: Fri, 15 Apr 2022 13:32:16 +0200 Subject: [PATCH] migrate player language settings to DialogFragment; update hideBars() * player language settings is now aDialogFragment * update hideBars() to work with any window & view combination * update hideBars() to use WindowCompat --- .../ui/activity/player/PlayerActivity.kt | 11 ++- .../LanguageSettingsDialogFragment.kt} | 84 +++++++++++-------- .../org/mosad/teapod/util/ActivityUtils.kt | 26 +----- .../main/java/org/mosad/teapod/util/Utils.kt | 15 ++++ app/src/main/res/layout/activity_player.xml | 6 +- .../res/layout/player_language_settings.xml | 4 +- app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/styles.xml | 9 ++ 8 files changed, 87 insertions(+), 71 deletions(-) rename app/src/main/java/org/mosad/teapod/ui/{components/LanguageSettingsPlayer.kt => activity/player/fragment/LanguageSettingsDialogFragment.kt} (56%) diff --git a/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerActivity.kt b/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerActivity.kt index a2df0ac..a9b4e85 100644 --- a/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerActivity.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/player/PlayerActivity.kt @@ -53,9 +53,11 @@ import kotlinx.coroutines.launch import org.mosad.teapod.R import org.mosad.teapod.parser.crunchyroll.NoneEpisode import org.mosad.teapod.preferences.Preferences +import org.mosad.teapod.ui.activity.player.fragment.LanguageSettingsDialogFragment import org.mosad.teapod.ui.components.EpisodesListPlayer -import org.mosad.teapod.ui.components.LanguageSettingsPlayer -import org.mosad.teapod.util.* +import org.mosad.teapod.util.hideBars +import org.mosad.teapod.util.isInPiPMode +import org.mosad.teapod.util.navToLauncherTask import java.util.* import java.util.concurrent.TimeUnit import kotlin.concurrent.scheduleAtFixedRate @@ -486,11 +488,8 @@ class PlayerActivity : AppCompatActivity() { } private fun showLanguageSettings() { - val languageSettings = LanguageSettingsPlayer(this, model = model).apply { - onViewRemovedAction = { model.player.play() } - } - player_layout.addView(languageSettings) pauseAndHideControls() + LanguageSettingsDialogFragment().show(supportFragmentManager, LanguageSettingsDialogFragment.TAG) } /** diff --git a/app/src/main/java/org/mosad/teapod/ui/components/LanguageSettingsPlayer.kt b/app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt similarity index 56% rename from app/src/main/java/org/mosad/teapod/ui/components/LanguageSettingsPlayer.kt rename to app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt index e21e586..ceb3da8 100644 --- a/app/src/main/java/org/mosad/teapod/ui/components/LanguageSettingsPlayer.kt +++ b/app/src/main/java/org/mosad/teapod/ui/activity/player/fragment/LanguageSettingsDialogFragment.kt @@ -1,54 +1,75 @@ -package org.mosad.teapod.ui.components +package org.mosad.teapod.ui.activity.player.fragment -import android.content.Context +import android.content.DialogInterface import android.graphics.Color import android.graphics.Typeface -import android.util.AttributeSet +import android.os.Bundle import android.util.TypedValue import android.view.Gravity import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup -import android.widget.LinearLayout import android.widget.TextView import androidx.core.view.children +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider import org.mosad.teapod.R import org.mosad.teapod.databinding.PlayerLanguageSettingsBinding import org.mosad.teapod.ui.activity.player.PlayerViewModel +import org.mosad.teapod.util.hideBars import java.util.* -// TODO port to DialogFragment -class LanguageSettingsPlayer @JvmOverloads constructor( - context: Context, - attrs: AttributeSet? = null, - defStyleAttr: Int = 0, - model: PlayerViewModel? = null -) : LinearLayout(context, attrs, defStyleAttr) { +class LanguageSettingsDialogFragment : DialogFragment() { - private val binding = PlayerLanguageSettingsBinding.inflate(LayoutInflater.from(context), this, true) - var onViewRemovedAction: (() -> Unit)? = null + private lateinit var model: PlayerViewModel + private lateinit var binding: PlayerLanguageSettingsBinding - private var selectedLocale = model?.currentLanguage ?: Locale.ROOT + private var selectedLocale = Locale.ROOT - init { - model?.let { m -> - m.currentPlayback.streams.adaptive_hls.keys.forEach { languageTag -> - val locale = Locale.forLanguageTag(languageTag) - addLanguage(locale, locale == m.currentLanguage) { v -> - selectedLocale = locale - updateSelectedLanguage(v as TextView) - } + companion object { + const val TAG = "LanguageSettingsDialogFragment" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setStyle(STYLE_NO_TITLE, R.style.FullScreenDialogStyle) + model = ViewModelProvider(requireActivity())[PlayerViewModel::class.java] + selectedLocale = model.currentLanguage + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + binding = PlayerLanguageSettingsBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + model.currentPlayback.streams.adaptive_hls.keys.forEach { languageTag -> + val locale = Locale.forLanguageTag(languageTag) + addLanguage(locale, locale == model.currentLanguage) { v -> + selectedLocale = locale + updateSelectedLanguage(v as TextView) } } - binding.buttonCloseLanguageSettings.setOnClickListener { close() } - binding.buttonCancel.setOnClickListener { close() } + binding.buttonCloseLanguageSettings.setOnClickListener { dismiss() } + binding.buttonCancel.setOnClickListener { dismiss() } binding.buttonSelect.setOnClickListener { - model?.setLanguage(selectedLocale) - close() + model.setLanguage(selectedLocale) + dismiss() } + + // initially hide the status and navigation bar + hideBars(requireDialog().window, binding.root) } - private fun addLanguage(locale: Locale, isSelected: Boolean, onClick: OnClickListener) { + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + model.player.play() + } + + private fun addLanguage(locale: Locale, isSelected: Boolean, onClick: View.OnClickListener) { val text = TextView(context).apply { height = 96 gravity = Gravity.CENTER_VERTICAL @@ -83,12 +104,11 @@ class LanguageSettingsPlayer @JvmOverloads constructor( setPadding(75, 0, 0, 0) } } - } // set selected to selected style selected.apply { - setTextColor(context.resources.getColor(R.color.exo_white, context.theme)) + setTextColor(context.resources.getColor(R.color.player_white, context.theme)) setTypeface(null, Typeface.BOLD) setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_baseline_check_24, 0, 0, 0) setPadding(0, 0, 0, 0) @@ -96,10 +116,4 @@ class LanguageSettingsPlayer @JvmOverloads constructor( compoundDrawablePadding = 12 } } - - private fun close() { - (this.parent as ViewGroup).removeView(this) - onViewRemovedAction?.invoke() - } - } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt b/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt index 65c48cd..668e7eb 100644 --- a/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt +++ b/app/src/main/java/org/mosad/teapod/util/ActivityUtils.kt @@ -5,9 +5,6 @@ import android.app.ActivityManager import android.content.Context import android.content.Intent import android.os.Build -import android.view.View -import android.view.WindowInsets -import android.view.WindowInsetsController import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.fragment.app.commit @@ -31,28 +28,7 @@ fun FragmentActivity.showFragment(fragment: Fragment) { * hide the status and navigation bar */ fun Activity.hideBars() { - window.apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - setDecorFitsSystemWindows(false) - insetsController?.apply { - hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars()) - systemBarsBehavior = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - WindowInsetsController.BEHAVIOR_DEFAULT - } else { - @Suppress("deprecation") - WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE - } - } - } else { - @Suppress("deprecation") - decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE - or View.SYSTEM_UI_FLAG_LAYOUT_STABLE - or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_FULLSCREEN) - } - } + hideBars(window, window.decorView.rootView) } fun Activity.isInPiPMode(): Boolean { diff --git a/app/src/main/java/org/mosad/teapod/util/Utils.kt b/app/src/main/java/org/mosad/teapod/util/Utils.kt index e7c7d94..09116ea 100644 --- a/app/src/main/java/org/mosad/teapod/util/Utils.kt +++ b/app/src/main/java/org/mosad/teapod/util/Utils.kt @@ -1,6 +1,11 @@ package org.mosad.teapod.util +import android.view.View +import android.view.Window import android.widget.TextView +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat import org.mosad.teapod.parser.crunchyroll.Collection import org.mosad.teapod.parser.crunchyroll.ContinueWatchingItem import org.mosad.teapod.parser.crunchyroll.Item @@ -50,3 +55,13 @@ fun Locale.toDisplayString(fallback: String): String { fallback } } + +fun hideBars(window: Window?, root: View) { + if (window != null) { + WindowCompat.setDecorFitsSystemWindows(window, false) + WindowInsetsControllerCompat(window, root).let { controller -> + controller.hide(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.navigationBars()) + controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE + } + } +} diff --git a/app/src/main/res/layout/activity_player.xml b/app/src/main/res/layout/activity_player.xml index 92b9a22..f6a2ac3 100644 --- a/app/src/main/res/layout/activity_player.xml +++ b/app/src/main/res/layout/activity_player.xml @@ -24,7 +24,7 @@ android:layout_height="70dp" android:layout_gravity="center" android:indeterminate="true" - app:indicatorColor="@color/exo_white" + app:indicatorColor="@color/player_white" tools:visibility="visible" /> \ No newline at end of file diff --git a/app/src/main/res/layout/player_language_settings.xml b/app/src/main/res/layout/player_language_settings.xml index badc45f..6b610f4 100644 --- a/app/src/main/res/layout/player_language_settings.xml +++ b/app/src/main/res/layout/player_language_settings.xml @@ -37,7 +37,7 @@ android:layout_marginEnd="44dp" android:text="@string/subtitles" android:textAlignment="center" - android:textColor="@color/exo_white" + android:textColor="@color/player_white" android:textSize="16sp" android:textStyle="bold" /> @@ -75,7 +75,7 @@ android:layout_marginEnd="7dp" android:text="@string/cancel" android:textAllCaps="false" - android:textColor="@color/exo_white" + android:textColor="@color/player_white" android:textSize="16sp" app:backgroundTint="@color/buttonBackgroundLight" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 1af8678..6844a80 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -26,6 +26,9 @@ #ffffff #11ffffff + + #ffffff + #ffffff #ffffff \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a0e77a2..50124a6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -86,4 +86,13 @@ ?themeSecondary + + + \ No newline at end of file