subs settings not working :(

This commit is contained in:
LagradOst 2021-08-06 22:55:11 +02:00
parent e59b26cb0e
commit 0ec5d166df
16 changed files with 665 additions and 200 deletions

View file

@ -91,4 +91,7 @@ dependencies {
annotationProcessor "com.google.auto.service:auto-service:1.0" annotationProcessor "com.google.auto.service:auto-service:1.0"
//or for kotlin sources (requires kapt gradle plugin): //or for kotlin sources (requires kapt gradle plugin):
kapt "com.google.auto.service:auto-service:1.0" kapt "com.google.auto.service:auto-service:1.0"
// subtitle color picker
implementation 'com.jaredrummler:colorpicker:1.1.0'
} }

View file

@ -13,6 +13,7 @@ import androidx.navigation.NavOptions
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import com.google.android.gms.cast.framework.CastButtonFactory import com.google.android.gms.cast.framework.CastButtonFactory
import com.jaredrummler.android.colorpicker.ColorPickerDialogListener
import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.APIHolder.apis
import com.lagradost.cloudstream3.utils.UIHelper.checkWrite import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
import com.lagradost.cloudstream3.utils.UIHelper.getResourceColor import com.lagradost.cloudstream3.utils.UIHelper.getResourceColor
@ -46,21 +47,23 @@ const val VLC_EXTRA_POSITION_OUT = "extra_position"
const val VLC_EXTRA_DURATION_OUT = "extra_duration" const val VLC_EXTRA_DURATION_OUT = "extra_duration"
const val VLC_LAST_ID_KEY = "vlc_last_open_id" const val VLC_LAST_ID_KEY = "vlc_last_open_id"
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity(), ColorPickerDialogListener {
/*, ViewModelStoreOwner { override fun onColorSelected(dialogId: Int, color: Int) {
private val appViewModelStore: ViewModelStore by lazy { onColorSelectedEvent.invoke(Pair(dialogId, color))
ViewModelStore() }
override fun onDialogDismissed(dialogId: Int) {
onDialogDismissedEvent.invoke(dialogId)
} }
override fun getViewModelStore(): ViewModelStore {
return appViewModelStore
}*/
companion object { companion object {
var canEnterPipMode: Boolean = false var canEnterPipMode: Boolean = false
var canShowPipMode: Boolean = false var canShowPipMode: Boolean = false
var isInPIPMode: Boolean = false var isInPIPMode: Boolean = false
val backEvent = Event<Boolean>() val backEvent = Event<Boolean>()
val onColorSelectedEvent = Event<Pair<Int, Int>>()
val onDialogDismissedEvent = Event<Int>()
lateinit var navOptions: NavOptions lateinit var navOptions: NavOptions
} }
@ -288,4 +291,5 @@ class MainActivity : AppCompatActivity() {
}*/ }*/
handleAppIntent(intent) handleAppIntent(intent)
} }
} }

View file

@ -65,6 +65,10 @@ import com.lagradost.cloudstream3.mvvm.observe
import com.lagradost.cloudstream3.mvvm.observeDirectly import com.lagradost.cloudstream3.mvvm.observeDirectly
import com.lagradost.cloudstream3.ui.result.ResultEpisode import com.lagradost.cloudstream3.ui.result.ResultEpisode
import com.lagradost.cloudstream3.ui.result.ResultViewModel import com.lagradost.cloudstream3.ui.result.ResultViewModel
import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.fromSaveToStyle
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.getCurrentSavedStyle
import com.lagradost.cloudstream3.utils.AppUtils.getFocusRequest import com.lagradost.cloudstream3.utils.AppUtils.getFocusRequest
import com.lagradost.cloudstream3.utils.AppUtils.getVideoContentUri import com.lagradost.cloudstream3.utils.AppUtils.getVideoContentUri
import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable import com.lagradost.cloudstream3.utils.AppUtils.isCastApiAvailable
@ -75,6 +79,7 @@ import com.lagradost.cloudstream3.utils.DataStore.getKey
import com.lagradost.cloudstream3.utils.DataStore.setKey import com.lagradost.cloudstream3.utils.DataStore.setKey
import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos import com.lagradost.cloudstream3.utils.DataStoreHelper.setViewPos
import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog
import com.lagradost.cloudstream3.utils.UIHelper.getNavigationBarHeight import com.lagradost.cloudstream3.utils.UIHelper.getNavigationBarHeight
import com.lagradost.cloudstream3.utils.UIHelper.getStatusBarHeight import com.lagradost.cloudstream3.utils.UIHelper.getStatusBarHeight
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
@ -145,6 +150,9 @@ data class UriData(
// YE, I KNOW, THIS COULD BE HANDLED A LOT BETTER // YE, I KNOW, THIS COULD BE HANDLED A LOT BETTER
class PlayerFragment : Fragment() { class PlayerFragment : Fragment() {
private lateinit var subStyle: SaveCaptionStyle
private var subView: SubtitleView? = null
private var isCurrentlyPlaying: Boolean = false private var isCurrentlyPlaying: Boolean = false
private val mapper = JsonMapper.builder().addModule(KotlinModule()) private val mapper = JsonMapper.builder().addModule(KotlinModule())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build()
@ -788,18 +796,19 @@ class PlayerFragment : Fragment() {
} }
//endregion //endregion
private fun onSubStyleChanged(style : SaveCaptionStyle) {
subView?.setStyle(fromSaveToStyle(subStyle))
subView?.translationY = -subStyle.elevation.toPx.toFloat()
}
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val subs = player_view.findViewById<SubtitleView>(R.id.exo_subtitles) subView = player_view.findViewById(R.id.exo_subtitles)
subs.setStyle( subStyle = context?.getCurrentSavedStyle()!!
CaptionStyleCompat( onSubStyleChanged(subStyle)
Color.WHITE, Color.TRANSPARENT, Color.TRANSPARENT, CaptionStyleCompat.EDGE_TYPE_OUTLINE, Color.BLACK, SubtitlesFragment.applyStyleEvent += ::onSubStyleChanged
Typeface.SANS_SERIF
)
)
subs.translationY = -10.toPx.toFloat()
settingsManager = PreferenceManager.getDefaultSharedPreferences(activity) settingsManager = PreferenceManager.getDefaultSharedPreferences(activity)
swipeEnabled = settingsManager.getBoolean("swipe_enabled", true) swipeEnabled = settingsManager.getBoolean("swipe_enabled", true)
@ -1115,64 +1124,19 @@ class PlayerFragment : Fragment() {
playback_speed_btt.visibility = if (playBackSpeedEnabled) VISIBLE else GONE playback_speed_btt.visibility = if (playBackSpeedEnabled) VISIBLE else GONE
playback_speed_btt.setOnClickListener { playback_speed_btt.setOnClickListener {
lateinit var dialog: AlertDialog
// Lmao kind bad
val speedsText = listOf("0.5x", "0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x") val speedsText = listOf("0.5x", "0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x")
val speedsNumbers = listOf(0.5f, 0.75f, 1f, 1.25f, 1.5f, 1.75f, 2f) val speedsNumbers = listOf(0.5f, 0.75f, 1f, 1.25f, 1.5f, 1.75f, 2f)
val builder =
AlertDialog.Builder(requireContext(), R.style.AlertDialogCustom).setView(R.layout.player_select_speed)
val speedDialog = builder.create()
speedDialog.show()
val speedList = speedDialog.findViewById<ListView>(R.id.sort_speed)!!
// val applyButton = speedDialog.findViewById<MaterialButton>(R.id.pick_source_apply)!!
// val cancelButton = speedDialog.findViewById<MaterialButton>(R.id.pick_source_cancel)!!
val arrayAdapter = ArrayAdapter<String>(view.context, R.layout.sort_bottom_single_choice)
arrayAdapter.addAll(speedsText)
speedList.adapter = arrayAdapter
speedList.choiceMode = AbsListView.CHOICE_MODE_SINGLE
val speedIndex = speedsNumbers.indexOf(playbackSpeed) val speedIndex = speedsNumbers.indexOf(playbackSpeed)
speedList.setSelection(speedIndex) context?.showDialog(speedsText,speedIndex,"Player Speed", false) { index ->
speedList.setItemChecked(speedIndex, true) playbackSpeed = speedsNumbers[index]
speedList.setOnItemClickListener { _, _, which, _ ->
playbackSpeed = speedsNumbers[which]
requireContext().setKey(PLAYBACK_SPEED_KEY, playbackSpeed) requireContext().setKey(PLAYBACK_SPEED_KEY, playbackSpeed)
val param = PlaybackParameters(playbackSpeed) val param = PlaybackParameters(playbackSpeed)
exoPlayer.playbackParameters = param exoPlayer.playbackParameters = param
player_speed_text.text = "Speed (${playbackSpeed}x)".replace(".0x", "x") player_speed_text.text = "Speed (${playbackSpeed}x)".replace(".0x", "x")
speedDialog.dismiss()
activity?.hideSystemUI() activity?.hideSystemUI()
} }
/*
builder.setTitle("Pick playback speed")
builder.setOnDismissListener {
activity?.hideSystemUI()
}
builder.setSingleChoiceItems(speedsText, speedsNumbers.indexOf(playbackSpeed)) { _, which ->
//val speed = speedsText[which]
//Toast.makeText(requireContext(), "$speed selected.", Toast.LENGTH_SHORT).show()
playbackSpeed = speedsNumbers[which]
requireContext().setKey(PLAYBACK_SPEED_KEY, playbackSpeed)
val param = PlaybackParameters(playbackSpeed)
exoPlayer.playbackParameters = param
player_speed_text.text = "Speed (${playbackSpeed}x)".replace(".0x", "x")
dialog.dismiss()
activity?.hideSystemUI()
}
dialog = builder.create()
dialog.show()*/
} }
sources_btt.setOnClickListener { sources_btt.setOnClickListener {
@ -1191,8 +1155,13 @@ class PlayerFragment : Fragment() {
// bottomSheetDialog.setContentView(R.layout.sort_bottom_sheet) // bottomSheetDialog.setContentView(R.layout.sort_bottom_sheet)
val providerList = sourceDialog.findViewById<ListView>(R.id.sort_providers)!! val providerList = sourceDialog.findViewById<ListView>(R.id.sort_providers)!!
val subtitleList = sourceDialog.findViewById<ListView>(R.id.sort_subtitles)!! val subtitleList = sourceDialog.findViewById<ListView>(R.id.sort_subtitles)!!
val applyButton = sourceDialog.findViewById<MaterialButton>(R.id.pick_source_apply)!! val applyButton = sourceDialog.findViewById<MaterialButton>(R.id.apply_btt)!!
val cancelButton = sourceDialog.findViewById<MaterialButton>(R.id.pick_source_cancel)!! val cancelButton = sourceDialog.findViewById<MaterialButton>(R.id.cancel_btt)!!
val subsSettings = sourceDialog.findViewById<ImageView>(R.id.subs_settings)!!
subsSettings.setOnClickListener {
SubtitlesFragment.push(activity)
}
val startSource = sources.indexOf(getCurrentUrl()) val startSource = sources.indexOf(getCurrentUrl())
var sourceIndex = startSource var sourceIndex = startSource
@ -1450,6 +1419,7 @@ class PlayerFragment : Fragment() {
override fun onDestroy() { override fun onDestroy() {
savePos() savePos()
SubtitlesFragment.applyStyleEvent -= ::onSubStyleChanged
super.onDestroy() super.onDestroy()
canEnterPipMode = false canEnterPipMode = false

View file

@ -330,9 +330,7 @@ class ResultFragment : Fragment() {
return true return true
} }
val skipLoading = if (apiName != null) { val skipLoading = getApiFromName(apiName).instantLinkLoading
getApiFromName(apiName).instantLinkLoading
} else false
var loadingDialog: AlertDialog? = null var loadingDialog: AlertDialog? = null
val currentLoad = currentLoadingCount val currentLoad = currentLoadingCount

View file

@ -23,6 +23,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
import com.lagradost.cloudstream3.utils.UIHelper.getGridIsCompact import com.lagradost.cloudstream3.utils.UIHelper.getGridIsCompact
import com.lagradost.cloudstream3.mvvm.Resource import com.lagradost.cloudstream3.mvvm.Resource
import com.lagradost.cloudstream3.mvvm.observe import com.lagradost.cloudstream3.mvvm.observe
import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment
import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard import com.lagradost.cloudstream3.utils.UIHelper.hideKeyboard
import kotlinx.android.synthetic.main.fragment_search.* import kotlinx.android.synthetic.main.fragment_search.*
@ -171,8 +172,8 @@ class SearchFragment : Fragment() {
}, 200) }, 200)
} }
} }
main_search.onActionViewExpanded() // main_search.onActionViewExpanded()
SubtitlesFragment.push(activity)
//searchViewModel.search("iron man") //searchViewModel.search("iron man")
//(activity as AppCompatActivity).loadResult("https://shiro.is/overlord-dubbed", "overlord-dubbed", "Shiro") //(activity as AppCompatActivity).loadResult("https://shiro.is/overlord-dubbed", "overlord-dubbed", "Shiro")
/* /*
@ -184,4 +185,5 @@ class SearchFragment : Fragment() {
.add(R.id.homeRoot, PlayerFragment.newInstance(PlayerData(0, null,0))) .add(R.id.homeRoot, PlayerFragment.newInstance(PlayerData(0, null,0)))
.commit()*/ .commit()*/
} }
} }

View file

@ -0,0 +1,263 @@
package com.lagradost.cloudstream3.ui.subtitles
import android.app.Activity
import android.content.Context
import android.content.res.Resources
import android.graphics.Color
import android.graphics.Typeface
import android.os.Bundle
import android.util.DisplayMetrics
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import com.google.android.exoplayer2.text.Cue
import com.google.android.exoplayer2.ui.CaptionStyleCompat
import com.jaredrummler.android.colorpicker.ColorPickerDialog
import com.lagradost.cloudstream3.MainActivity
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.utils.DataStore.getKey
import com.lagradost.cloudstream3.utils.DataStore.setKey
import com.lagradost.cloudstream3.utils.Event
import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog
import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar
import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage
import kotlinx.android.synthetic.main.subtitle_settings.*
const val SUBTITLE_KEY = "subtitle_settings"
data class SaveCaptionStyle(
var foregroundColor: Int,
var backgroundColor: Int,
var windowColor: Int,
@CaptionStyleCompat.EdgeType
var edgeType: Int,
var edgeColor: Int,
var typeface: String?,
/**in dp**/
var elevation: Int,
)
class SubtitlesFragment : Fragment() {
companion object {
val applyStyleEvent = Event<SaveCaptionStyle>()
fun fromSaveToStyle(data: SaveCaptionStyle): CaptionStyleCompat {
return CaptionStyleCompat(
data.foregroundColor, data.backgroundColor, data.windowColor, data.edgeType, data.edgeColor,
Typeface.SANS_SERIF
)
}
fun push(activity: Activity?) {
(activity as FragmentActivity?)?.supportFragmentManager?.beginTransaction()
?.setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim,
R.anim.pop_enter,
R.anim.pop_exit
)
?.add(
R.id.homeRoot,
SubtitlesFragment()
)
?.commit()
}
private fun getDefColor(id: Int): Int {
return when (id) {
0 -> Color.WHITE
1 -> Color.BLACK
2 -> Color.TRANSPARENT
3 -> Color.TRANSPARENT
else -> Color.TRANSPARENT
}
}
fun Context.saveStyle(style: SaveCaptionStyle) {
this.setKey(SUBTITLE_KEY, style)
}
fun Context.getCurrentSavedStyle(): SaveCaptionStyle {
return this.getKey(SUBTITLE_KEY) ?: SaveCaptionStyle(
getDefColor(0),
getDefColor(2),
getDefColor(3),
CaptionStyleCompat.EDGE_TYPE_OUTLINE,
getDefColor(1),
null,
0,
)
}
private fun Context.getCurrentStyle(): CaptionStyleCompat {
return fromSaveToStyle(getCurrentSavedStyle())
}
private fun getPixels(unit: Int, size: Float): Int {
val metrics: DisplayMetrics = Resources.getSystem().displayMetrics
return TypedValue.applyDimension(unit, size, metrics).toInt()
}
}
private fun onColorSelected(stuff: Pair<Int, Int>) {
setColor(stuff.first, stuff.second)
}
private fun setColor(id: Int, color: Int?) {
val realColor = color ?: getDefColor(id)
when (id) {
0 -> state.foregroundColor = realColor
1 -> state.edgeColor = realColor
2 -> state.backgroundColor = realColor
3 -> state.windowColor = realColor
else -> {
}
}
updateState()
}
fun updateState() {
subtitle_text?.setStyle(fromSaveToStyle(state))
}
private fun getColor(id: Int): Int {
val color = when (id) {
0 -> state.foregroundColor
1 -> state.edgeColor
2 -> state.backgroundColor
3 -> state.windowColor
else -> Color.TRANSPARENT
}
return if (color == Color.TRANSPARENT) Color.BLACK else color
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View? {
return inflater.inflate(R.layout.subtitle_settings, container, false)
}
lateinit var state: SaveCaptionStyle
override fun onDestroy() {
super.onDestroy()
MainActivity.onColorSelectedEvent -= ::onColorSelected
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
MainActivity.onColorSelectedEvent += ::onColorSelected
context?.fixPaddingStatusbar(subs_root)
state = requireContext().getCurrentSavedStyle()
updateState()
fun View.setup(id: Int) {
this.setOnClickListener {
activity?.let {
ColorPickerDialog.newBuilder()
.setDialogId(id)
.setColor(getColor(id))
.show(it)
}
}
this.setOnLongClickListener {
setColor(id, null)
Toast.makeText(it.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
return@setOnLongClickListener true
}
}
subs_text_color.setup(0)
subs_outline_color.setup(1)
subs_background_color.setup(2)
subs_window_color.setup(3)
subs_subtitle_elevation.setOnClickListener { textView ->
val elevationTypes = listOf(
Pair(0, "None"),
Pair(10, "10"),
Pair(20, "20"),
Pair(30, "30"),
Pair(40, "40"),
)
textView.context.showBottomDialog(
elevationTypes.map { it.second },
elevationTypes.map { it.first }.indexOf(state.elevation),
(textView as TextView).text.toString(),
false
) { index ->
state.elevation = elevationTypes.map { it.first }[index]
updateState()
}
}
subs_subtitle_elevation.setOnLongClickListener {
state.elevation = 0
updateState()
Toast.makeText(it.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
return@setOnLongClickListener true
}
subs_edge_type.setOnClickListener { textView ->
val edgeTypes = listOf(
Pair(CaptionStyleCompat.EDGE_TYPE_NONE, "None"),
Pair(CaptionStyleCompat.EDGE_TYPE_OUTLINE, "Outline"),
Pair(CaptionStyleCompat.EDGE_TYPE_DEPRESSED, "Depressed"),
Pair(CaptionStyleCompat.EDGE_TYPE_DROP_SHADOW, "Shadow"),
Pair(CaptionStyleCompat.EDGE_TYPE_RAISED, "Raised"),
)
textView.context.showBottomDialog(
edgeTypes.map { it.second },
edgeTypes.map { it.first }.indexOf(state.edgeType),
(textView as TextView).text.toString(),
false
) { index ->
state.edgeType = edgeTypes.map { it.first }[index]
updateState()
}
}
subs_edge_type.setOnLongClickListener {
state.edgeType = CaptionStyleCompat.EDGE_TYPE_OUTLINE
updateState()
Toast.makeText(it.context, R.string.subs_default_reset_toast, Toast.LENGTH_SHORT).show()
return@setOnLongClickListener true
}
cancel_btt.setOnClickListener {
activity?.popCurrentPage()
}
apply_btt.setOnClickListener {
applyStyleEvent.invoke(state)
fromSaveToStyle(state)
activity?.popCurrentPage()
}
subtitle_text.setCues(
listOf(
Cue.Builder()
.setTextSize(
getPixels(TypedValue.COMPLEX_UNIT_SP, 25.0f).toFloat(),
Cue.TEXT_SIZE_TYPE_ABSOLUTE
)
.setText("The quick brown fox jumps over the lazy dog").build()
)
)
}
}

View file

@ -0,0 +1,98 @@
package com.lagradost.cloudstream3.utils
import android.app.Dialog
import android.content.Context
import android.view.View
import android.widget.*
import androidx.appcompat.app.AlertDialog
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.lagradost.cloudstream3.R
object SingleSelectionHelper {
fun Context.showDialog(
dialog: Dialog,
items: List<String>,
selectedIndex: Int,
name: String,
showApply: Boolean,
callback: (Int) -> Unit
) {
val listView = dialog.findViewById<ListView>(R.id.listview1)!!
val textView = dialog.findViewById<TextView>(R.id.text1)!!
val applyButton = dialog.findViewById<TextView>(R.id.apply_btt)!!
val cancelButton = dialog.findViewById<TextView>(R.id.cancel_btt)!!
val applyHolder = dialog.findViewById<LinearLayout>(R.id.apply_btt_holder)!!
applyHolder.visibility = if (showApply) View.VISIBLE else View.GONE
if (!showApply) {
val params = listView.layoutParams as LinearLayout.LayoutParams
params.setMargins(listView.marginLeft, listView.marginTop, listView.marginRight, 0)
listView.layoutParams = params
}
textView.text = name
val arrayAdapter = ArrayAdapter<String>(this, R.layout.sort_bottom_single_choice)
arrayAdapter.addAll(items)
listView.adapter = arrayAdapter
listView.choiceMode = AbsListView.CHOICE_MODE_SINGLE
listView.setSelection(selectedIndex)
listView.setItemChecked(selectedIndex, true)
var currentIndex = selectedIndex
listView.setOnItemClickListener { _, _, which, _ ->
if (showApply) {
currentIndex = which
listView.setItemChecked(which, true)
} else {
callback.invoke(which)
dialog.dismiss()
}
}
if (showApply) {
applyButton.setOnClickListener {
callback.invoke(currentIndex)
dialog.dismiss()
}
cancelButton.setOnClickListener {
dialog.dismiss()
}
}
}
fun Context.showDialog(
items: List<String>,
selectedIndex: Int,
name: String,
showApply: Boolean,
callback: (Int) -> Unit
) {
val builder =
AlertDialog.Builder(this, R.style.AlertDialogCustom).setView(R.layout.bottom_selection_dialog)
val dialog = builder.create()
dialog.show()
showDialog(dialog, items, selectedIndex, name, showApply, callback)
}
fun Context.showBottomDialog(
items: List<String>,
selectedIndex: Int,
name: String,
showApply: Boolean,
callback: (Int) -> Unit
) {
val builder =
BottomSheetDialog(this)
builder.setContentView(R.layout.bottom_selection_dialog)
builder.show()
showDialog(builder, items, selectedIndex, name, showApply, callback)
}
}

View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#FFF"
android:endColor="#000"
android:angle="0"/>
</shape>

View file

@ -15,7 +15,7 @@
android:id="@+id/nav_view" android:id="@+id/nav_view"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/darkBackground" android:background="?attr/darkBackground"
app:itemRippleColor="@color/colorRipple" app:itemRippleColor="@color/colorRipple"
app:labelVisibilityMode="labeled" app:labelVisibilityMode="labeled"

View file

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:background="?attr/bitDarkerGrayBackground"
android:layout_height="match_parent">
<TextView
android:id="@+id/text1"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:textStyle="bold"
android:textSize="20sp"
android:textColor="?attr/textColor"
android:layout_width="match_parent"
android:layout_rowWeight="1"
tools:text="Test"
android:layout_height="wrap_content">
</TextView>
<ListView
android:id="@+id/listview1"
android:layout_marginTop="-10dp"
android:layout_marginBottom="60dp"
android:paddingTop="10dp"
tools:listitem="@layout/sort_bottom_single_choice"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_rowWeight="1"
/>
<LinearLayout
android:id="@+id/apply_btt_holder"
android:orientation="horizontal"
android:layout_gravity="bottom"
android:gravity="bottom|end"
android:layout_marginTop="-60dp"
android:layout_width="match_parent"
android:layout_height="60dp">
<com.google.android.material.button.MaterialButton
style="@style/WhiteButton"
android:layout_gravity="center_vertical|end"
android:text="@string/sort_apply"
android:id="@+id/apply_btt"
android:layout_width="wrap_content"
/>
<com.google.android.material.button.MaterialButton
style="@style/BlackButton"
android:layout_gravity="center_vertical|end"
android:text="@string/sort_cancel"
android:id="@+id/cancel_btt"
android:layout_width="wrap_content"
/>
</LinearLayout>
</LinearLayout>

View file

@ -26,49 +26,22 @@
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:layout_gravity="center" android:layout_gravity="center"
android:layout_height="50dp" style="@style/WhiteButton"
android:layout_margin="5dp"
android:visibility="visible"
android:textStyle="bold"
app:rippleColor="?attr/grayBackground"
android:textColor="?attr/grayBackground"
app:iconTint="?attr/grayBackground"
android:textAllCaps="false"
app:iconGravity="textStart"
app:strokeColor="?attr/grayBackground"
app:backgroundTint="?attr/textColor"
app:icon="@drawable/ic_baseline_autorenew_24" app:icon="@drawable/ic_baseline_autorenew_24"
app:iconSize="20dp"
android:text="@string/reload_error" android:text="@string/reload_error"
android:id="@+id/home_reload_connectionerror" android:id="@+id/home_reload_connectionerror"
android:textSize="15sp"
app:cornerRadius="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:minWidth="200dp" android:minWidth="200dp"
> >
</com.google.android.material.button.MaterialButton> </com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:layout_gravity="center" android:layout_gravity="center"
android:layout_height="50dp" style="@style/BlackButton"
android:layout_margin="5dp"
app:iconGravity="textStart"
app:strokeColor="?attr/textColor"
android:backgroundTint="?attr/grayBackground"
app:rippleColor="?attr/textColor"
android:textColor="?attr/textColor"
app:iconTint="?attr/textColor"
android:textAllCaps="false"
android:textStyle="bold"
app:icon="@drawable/ic_baseline_public_24" app:icon="@drawable/ic_baseline_public_24"
app:iconSize="20dp"
android:text="@string/result_open_in_browser" android:text="@string/result_open_in_browser"
android:id="@+id/home_reload_connection_open_in_browser" android:id="@+id/home_reload_connection_open_in_browser"
android:textSize="15sp"
app:cornerRadius="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:minWidth="200dp" android:minWidth="200dp"
> >
@ -147,48 +120,26 @@
android:contentDescription="@string/home_next_random"> android:contentDescription="@string/home_next_random">
</ImageView> </ImageView>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:layout_margin="5dp" style="@style/WhiteButton"
android:visibility="visible" android:visibility="visible"
android:layout_gravity="center" android:layout_gravity="center"
app:cornerRadius="4dp"
android:id="@+id/home_main_play" android:id="@+id/home_main_play"
android:text="@string/home_play" android:text="@string/home_play"
android:textStyle="bold"
app:rippleColor="?attr/grayBackground"
android:textColor="?attr/grayBackground"
app:iconTint="?attr/grayBackground"
android:textAllCaps="false"
android:clickable="true"
android:focusable="true"
app:iconGravity="textStart"
app:strokeColor="?attr/grayBackground"
app:backgroundTint="?attr/textColor"
app:icon="@drawable/ic_baseline_play_arrow_24" app:icon="@drawable/ic_baseline_play_arrow_24"
android:layout_width="120dp" android:layout_width="120dp">
android:layout_height="50dp">
</com.google.android.material.button.MaterialButton> </com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:layout_margin="5dp" style="@style/BlackButton"
android:visibility="visible" android:visibility="visible"
android:layout_gravity="center" android:layout_gravity="center"
app:cornerRadius="4dp"
android:text="@string/home_info" android:text="@string/home_info"
app:icon="@drawable/ic_outline_info_24" app:icon="@drawable/ic_outline_info_24"
android:textStyle="bold"
android:id="@+id/home_main_info" android:id="@+id/home_main_info"
app:rippleColor="?attr/textColor"
android:textColor="?attr/textColor"
app:iconTint="?attr/textColor"
android:textAllCaps="false"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:backgroundTint="?attr/grayBackground" android:layout_width="120dp">
app:iconGravity="textStart"
app:strokeColor="?attr/textColor"
android:layout_width="120dp"
android:layout_height="50dp">
</com.google.android.material.button.MaterialButton> </com.google.android.material.button.MaterialButton>
<ImageView <ImageView
android:layout_gravity="center" android:layout_gravity="center"

View file

@ -306,46 +306,26 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
style="@style/WhiteButton"
android:visibility="visible" android:visibility="visible"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
app:cornerRadius="4dp"
android:id="@+id/result_play_movie" android:id="@+id/result_play_movie"
android:text="@string/play_movie_button" android:text="@string/play_movie_button"
android:textStyle="bold"
app:rippleColor="?attr/grayBackground"
android:textColor="?attr/grayBackground"
app:iconTint="?attr/grayBackground"
android:textAllCaps="false"
android:clickable="true"
android:focusable="true"
app:iconGravity="textStart"
app:strokeColor="?attr/grayBackground"
app:backgroundTint="?attr/textColor"
app:icon="@drawable/ic_baseline_play_arrow_24" app:icon="@drawable/ic_baseline_play_arrow_24"
android:layout_width="match_parent" android:layout_width="match_parent">
android:layout_height="50dp">
</com.google.android.material.button.MaterialButton> </com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
style="@style/BlackButton"
android:visibility="visible" android:visibility="visible"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
app:cornerRadius="4dp"
tools:text="Downloading" tools:text="Downloading"
tools:icon="@drawable/netflix_download" tools:icon="@drawable/netflix_download"
android:textStyle="bold"
android:id="@+id/result_download_movie" android:id="@+id/result_download_movie"
app:rippleColor="?attr/textColor"
android:textColor="?attr/textColor"
app:iconTint="?attr/textColor"
android:textAllCaps="false"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:backgroundTint="?attr/grayBackground" android:layout_width="match_parent">
app:iconGravity="textStart"
app:strokeColor="?attr/textColor"
android:layout_width="match_parent"
android:layout_height="50dp">
</com.google.android.material.button.MaterialButton> </com.google.android.material.button.MaterialButton>
<androidx.core.widget.ContentLoadingProgressBar <androidx.core.widget.ContentLoadingProgressBar

View file

@ -48,6 +48,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:layout_weight="50"> android:layout_weight="50">
<FrameLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView <TextView
android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
@ -61,6 +65,21 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
</TextView> </TextView>
<ImageView
android:id="@+id/subs_settings"
android:layout_marginTop="20dp"
android:layout_marginEnd="10dp"
android:layout_gravity="end"
android:background="?android:attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_outline_settings_24"
android:layout_width="25dp"
android:layout_height="25dp"
android:contentDescription="@string/home_change_provider">
</ImageView>
</FrameLayout>
<ListView <ListView
android:layout_marginTop="-10dp" android:layout_marginTop="-10dp"
android:paddingTop="10dp" android:paddingTop="10dp"
@ -83,49 +102,18 @@
android:layout_height="60dp"> android:layout_height="60dp">
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
style="@style/WhiteButton"
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:layout_height="50dp"
android:layout_margin="5dp"
android:visibility="visible"
android:textStyle="bold"
app:rippleColor="?attr/grayBackground"
android:textColor="?attr/grayBackground"
app:iconTint="?attr/grayBackground"
android:textAllCaps="false"
app:iconGravity="textStart"
app:strokeColor="?attr/grayBackground"
app:backgroundTint="?attr/textColor"
app:iconSize="20dp"
android:text="@string/sort_apply" android:text="@string/sort_apply"
android:id="@+id/pick_source_apply" android:id="@+id/apply_btt"
android:textSize="15sp"
app:cornerRadius="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
> />
</com.google.android.material.button.MaterialButton>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
style="@style/BlackButton"
android:layout_gravity="center_vertical|end" android:layout_gravity="center_vertical|end"
android:layout_height="50dp"
android:layout_margin="5dp"
app:iconGravity="textStart"
app:strokeColor="?attr/textColor"
android:backgroundTint="?attr/grayBackground"
app:rippleColor="?attr/textColor"
android:textColor="?attr/textColor"
app:iconTint="?attr/textColor"
android:textAllCaps="false"
android:textStyle="bold"
app:iconSize="20dp"
android:text="@string/sort_cancel" android:text="@string/sort_cancel"
android:id="@+id/pick_source_cancel" android:id="@+id/cancel_btt"
android:textSize="15sp"
app:cornerRadius="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
> />
</com.google.android.material.button.MaterialButton>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View file

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/subs_root"
android:background="?attr/bitDarkerGrayBackground"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:textStyle="bold"
android:text="@string/subtitles_settings"
android:textSize="20sp"
android:textColor="?attr/textColor"
android:layout_width="match_parent"
android:layout_rowWeight="1"
android:layout_height="wrap_content">
</TextView>
<com.google.android.exoplayer2.ui.SubtitleView
android:id="@+id/subtitle_text"
android:background="@drawable/subtitles_background_gradient"
android:layout_width="match_parent"
android:layout_gravity="center"
android:foregroundGravity="center"
android:layout_height="75sp">
</com.google.android.exoplayer2.ui.SubtitleView>
<TextView
android:id="@+id/subs_text_color"
android:text="@string/subs_text_color"
style="@style/SettingsItem"
/>
<TextView
android:id="@+id/subs_outline_color"
android:text="@string/subs_outline_color"
style="@style/SettingsItem"
/>
<TextView
android:id="@+id/subs_background_color"
android:text="@string/subs_background_color"
style="@style/SettingsItem"
/>
<TextView
android:id="@+id/subs_window_color"
android:text="@string/subs_window_color"
style="@style/SettingsItem"
/>
<TextView
android:id="@+id/subs_edge_type"
android:text="@string/subs_edge_type"
style="@style/SettingsItem"
/>
<TextView
android:id="@+id/subs_subtitle_elevation"
android:text="@string/subs_subtitle_elevation"
style="@style/SettingsItem"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_gravity="bottom"
android:gravity="bottom|end"
android:layout_width="match_parent"
android:layout_height="60dp">
<com.google.android.material.button.MaterialButton
style="@style/WhiteButton"
android:layout_gravity="center_vertical|end"
android:visibility="visible"
android:text="@string/sort_apply"
android:id="@+id/apply_btt"
android:layout_width="wrap_content"
/>
<com.google.android.material.button.MaterialButton
style="@style/BlackButton"
android:layout_gravity="center_vertical|end"
android:text="@string/sort_cancel"
android:id="@+id/cancel_btt"
android:layout_width="wrap_content"
/>
</LinearLayout>
</LinearLayout>
</ScrollView>

View file

@ -70,4 +70,12 @@
<string name="sort_apply">Apply</string> <string name="sort_apply">Apply</string>
<string name="sort_cancel">Cancel</string> <string name="sort_cancel">Cancel</string>
<string name="player_speed">Player Speed</string> <string name="player_speed">Player Speed</string>
<string name="subtitles_settings">Subtitle Settings</string>
<string name="subs_text_color">Text Color</string>
<string name="subs_outline_color">Outline Color</string>
<string name="subs_background_color">Background Color</string>
<string name="subs_window_color">Window Color</string>
<string name="subs_edge_type">Edge Type</string>
<string name="subs_subtitle_elevation">Subtitle Elevation</string>
<string name="subs_default_reset_toast">Reset to default value</string>
</resources> </resources>

View file

@ -132,6 +132,48 @@
<item name="android:backgroundTint">?attr/bitDarkerGrayBackground</item> <item name="android:backgroundTint">?attr/bitDarkerGrayBackground</item>
</style> </style>
<style name="SettingsItem">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">50sp</item>
<item name="android:gravity">center_vertical</item>
<item name="android:paddingStart">20dp</item>
<item name="android:paddingEnd">20dp</item>
<item name="android:selectAllOnFocus">true</item>
<item name="android:background">@color/transparent</item>
<item name="android:textColor">?attr/textColor</item>
<item name="android:foreground">?attr/selectableItemBackgroundBorderless</item>
<item name="android:textAppearance">?android:attr/textAppearanceListItemSmall</item>
<item name="drawableEndCompat">@drawable/ic_baseline_keyboard_arrow_right_24</item>
</style>
<style name="NiceButton">
<item name="android:layout_marginStart">5dp</item>
<item name="android:layout_marginEnd">5dp</item>
<item name="android:layout_height">50dp</item>
<item name="android:textStyle">bold</item>
<item name="android:textAllCaps">false</item>
<item name="iconGravity">textStart</item>
<item name="iconSize">20dp</item>
<item name="cornerRadius">4dp</item>
<item name="android:textSize">15sp</item>
</style>
<style name="WhiteButton" parent="NiceButton">
<item name="strokeColor">?attr/grayBackground</item>
<item name="backgroundTint">?attr/textColor</item>
<item name="iconTint">?attr/grayBackground</item>
<item name="android:textColor">?attr/grayBackground</item>
<item name="rippleColor">?attr/grayBackground</item>
</style>
<style name="BlackButton" parent="NiceButton">
<item name="strokeColor">?attr/textColor</item>
<item name="backgroundTint">?attr/grayBackground</item>
<item name="iconTint">?attr/textColor</item>
<item name="android:textColor">?attr/textColor</item>
<item name="rippleColor">?attr/textColor</item>
</style>
<!-- CHROMECAST --> <!-- CHROMECAST -->
<style name="CustomCastExpandedController" parent="CastExpandedController"> <style name="CustomCastExpandedController" parent="CastExpandedController">
<item name="castControlButtons"> <item name="castControlButtons">
@ -139,7 +181,8 @@
</item> </item>
<item name="castButtonColor">@null</item> <item name="castButtonColor">@null</item>
<item name="castSeekBarProgressAndThumbColor">@color/white</item> <!--@color/white ?attr/colorPrimary--> <item name="castSeekBarProgressAndThumbColor">@color/white</item> <!--@color/white ?attr/colorPrimary-->
<item name="castSeekBarSecondaryProgressColor">?attr/darkBackground</item> <!--CHECK ?attr/darkBackground ?attr/colorPrimary--> <item name="castSeekBarSecondaryProgressColor">?attr/darkBackground
</item> <!--CHECK ?attr/darkBackground ?attr/colorPrimary-->
<item name="castBackground">?attr/colorPrimary</item> <item name="castBackground">?attr/colorPrimary</item>
<item name="castProgressBarColor">?attr/colorPrimary</item> <item name="castProgressBarColor">?attr/colorPrimary</item>
<item name="castPlayButtonDrawable">@drawable/ic_baseline_play_arrow_24</item> <item name="castPlayButtonDrawable">@drawable/ic_baseline_play_arrow_24</item>