forked from recloudstream/cloudstream
		
	subs settings not working :(
This commit is contained in:
		
							parent
							
								
									e59b26cb0e
								
							
						
					
					
						commit
						0ec5d166df
					
				
					 16 changed files with 665 additions and 200 deletions
				
			
		|  | @ -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' | ||||||
| } | } | ||||||
|  | @ -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) | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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()*/ | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  | @ -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() | ||||||
|  |             ) | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -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) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -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> | ||||||
|  | @ -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" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										58
									
								
								app/src/main/res/layout/bottom_selection_dialog.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								app/src/main/res/layout/bottom_selection_dialog.xml
									
										
									
									
									
										Normal 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> | ||||||
|  | @ -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" | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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> | ||||||
|  |  | ||||||
							
								
								
									
										92
									
								
								app/src/main/res/layout/subtitle_settings.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								app/src/main/res/layout/subtitle_settings.xml
									
										
									
									
									
										Normal 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> | ||||||
|  | @ -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> | ||||||
|  | @ -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> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue