2020-12-20 20:21:27 +01:00
package org.mosad.teapod.ui.components
import android.content.Context
import android.graphics.Color
import android.graphics.Typeface
import android.util.AttributeSet
import android.util.TypedValue
import android.view.Gravity
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
2020-12-26 20:09:35 +01:00
import androidx.core.view.children
2020-12-20 20:21:27 +01:00
import org.mosad.teapod.R
import org.mosad.teapod.databinding.PlayerLanguageSettingsBinding
2021-02-06 19:02:12 +01:00
import org.mosad.teapod.ui.activity.player.PlayerViewModel
2020-12-27 20:11:01 +01:00
import java.util.*
2020-12-20 20:21:27 +01:00
2021-12-29 20:51:53 +01:00
// TODO port to DialogFragment
2020-12-20 20:21:27 +01:00
class LanguageSettingsPlayer @JvmOverloads constructor (
context : Context ,
attrs : AttributeSet ? = null ,
defStyleAttr : Int = 0 ,
model : PlayerViewModel ? = null
) : LinearLayout ( context , attrs , defStyleAttr ) {
private val binding = PlayerLanguageSettingsBinding . inflate ( LayoutInflater . from ( context ) , this , true )
2021-12-29 20:51:53 +01:00
var onViewRemovedAction : ( ( ) -> Unit ) ? = null
2020-12-20 20:21:27 +01:00
2021-12-29 20:51:53 +01:00
private var selectedLocale = model ?. currentLanguage ?: Locale . ROOT
2020-12-26 20:09:35 +01:00
2020-12-20 20:21:27 +01:00
init {
2021-12-29 20:51:53 +01:00
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 )
}
}
2020-12-26 20:09:35 +01:00
}
2020-12-20 20:21:27 +01:00
binding . buttonCloseLanguageSettings . setOnClickListener { close ( ) }
binding . buttonCancel . setOnClickListener { close ( ) }
2020-12-26 20:09:35 +01:00
binding . buttonSelect . setOnClickListener {
2021-12-29 20:51:53 +01:00
model ?. setLanguage ( selectedLocale )
2020-12-26 20:09:35 +01:00
close ( )
}
2020-12-20 20:21:27 +01:00
}
2021-12-29 20:51:53 +01:00
private fun addLanguage ( locale : Locale , isSelected : Boolean , onClick : OnClickListener ) {
2020-12-20 20:21:27 +01:00
val text = TextView ( context ) . apply {
height = 96
gravity = Gravity . CENTER _VERTICAL
2021-12-29 20:51:53 +01:00
text = if ( locale == Locale . ROOT ) context . getString ( R . string . no _subtitles ) else locale . displayLanguage
2020-12-20 20:21:27 +01:00
setTextSize ( TypedValue . COMPLEX _UNIT _SP , 16f )
if ( isSelected ) {
setTextColor ( context . resources . getColor ( R . color . exo _white , context . theme ) )
setTypeface ( null , Typeface . BOLD )
setCompoundDrawablesRelativeWithIntrinsicBounds ( R . drawable . ic _baseline _check _24 , 0 , 0 , 0 )
compoundDrawablesRelative . getOrNull ( 0 ) ?. setTint ( Color . WHITE )
compoundDrawablePadding = 12
} else {
setTextColor ( context . resources . getColor ( R . color . textPrimaryDark , context . theme ) )
setPadding ( 75 , 0 , 0 , 0 )
}
setOnClickListener ( onClick )
}
binding . linearLanguages . addView ( text )
}
2020-12-26 20:09:35 +01:00
private fun updateSelectedLanguage ( selected : TextView ) {
// rest all tf to not selected style
binding . linearLanguages . children . forEach { child ->
if ( child is TextView ) {
child . apply {
setTextColor ( context . resources . getColor ( R . color . textPrimaryDark , context . theme ) )
setTypeface ( null , Typeface . NORMAL )
setCompoundDrawablesRelativeWithIntrinsicBounds ( 0 , 0 , 0 , 0 )
setPadding ( 75 , 0 , 0 , 0 )
}
}
}
// set selected to selected style
selected . apply {
setTextColor ( context . resources . getColor ( R . color . exo _white , context . theme ) )
setTypeface ( null , Typeface . BOLD )
setCompoundDrawablesRelativeWithIntrinsicBounds ( R . drawable . ic _baseline _check _24 , 0 , 0 , 0 )
setPadding ( 0 , 0 , 0 , 0 )
compoundDrawablesRelative . getOrNull ( 0 ) ?. setTint ( Color . WHITE )
compoundDrawablePadding = 12
}
}
2020-12-20 20:21:27 +01:00
private fun close ( ) {
( this . parent as ViewGroup ) . removeView ( this )
onViewRemovedAction ?. invoke ( )
}
}