diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt index 85b3b363..be1b0e82 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt @@ -11,6 +11,9 @@ import android.view.Menu import android.view.MenuItem import android.view.WindowManager import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.IdRes import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible @@ -33,6 +36,7 @@ import com.lagradost.cloudstream3.APIHolder.apis import com.lagradost.cloudstream3.APIHolder.getApiDubstatusSettings import com.lagradost.cloudstream3.APIHolder.initAll import com.lagradost.cloudstream3.APIHolder.updateHasTrailers +import com.lagradost.cloudstream3.CommonActivity.currentToast import com.lagradost.cloudstream3.CommonActivity.loadThemes import com.lagradost.cloudstream3.CommonActivity.onColorSelectedEvent import com.lagradost.cloudstream3.CommonActivity.onDialogDismissedEvent @@ -85,7 +89,11 @@ import com.lagradost.cloudstream3.plugins.PluginManager import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringRepo import com.lagradost.cloudstream3.ui.setup.SetupFragmentExtensions import com.lagradost.cloudstream3.utils.AppUtils.loadRepository +import com.lagradost.cloudstream3.utils.Coroutines.main import com.lagradost.cloudstream3.utils.Event +import kotlinx.coroutines.delay +import java.lang.ref.WeakReference +import java.net.URI const val VLC_PACKAGE = "org.videolan.vlc" @@ -293,7 +301,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (VLC_REQUEST_CODE == requestCode) { + if (requestCode == VLC_REQUEST_CODE) { if (resultCode == RESULT_OK && data != null) { val pos: Long = data.getLongExtra( @@ -368,7 +376,7 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { } } } - } else if (str.contains(appStringRepo)) { + } else if (URI(str).scheme == appStringRepo) { val url = str.replaceFirst(appStringRepo, "https") loadRepository(url) } else { @@ -444,6 +452,28 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { } PluginManager.loadAllLocalPlugins(this@MainActivity) + + // Load cloned sites after plugins have been loaded since clones depend on plugins. + try { + getKey>(USER_PROVIDER_API)?.let { list -> + list.forEach { custom -> + allProviders.firstOrNull { it.javaClass.simpleName == custom.parentJavaClass } + ?.let { + allProviders.add(it.javaClass.newInstance().apply { + name = custom.name + lang = custom.lang + mainUrl = custom.url.trimEnd('/') + canBeOverridden = false + }) + } + } + } + apis = allProviders.distinctBy { it } + APIHolder.apiMap = null + } catch (e: Exception) { + logError(e) + } + afterPluginsLoadedEvent.invoke(true) } @@ -480,26 +510,6 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { initAll() // No duplicates (which can happen by registerMainAPI) apis = allProviders.distinctBy { it } - - try { - getKey>(USER_PROVIDER_API)?.let { list -> - list.forEach { custom -> - allProviders.firstOrNull { it.javaClass.simpleName == custom.parentJavaClass } - ?.let { - allProviders.add(it.javaClass.newInstance().apply { - name = custom.name - lang = custom.lang - mainUrl = custom.url.trimEnd('/') - canBeOverridden = false - }) - } - } - } - apis = allProviders.distinctBy { it } - APIHolder.apiMap = null - } catch (e: Exception) { - logError(e) - } } // val navView: BottomNavigationView = findViewById(R.id.nav_view) @@ -677,13 +687,25 @@ class MainActivity : AppCompatActivity(), ColorPickerDialogListener { && PluginManager.getPluginsLocal().isEmpty() // && PREBUILT_REPOSITORIES.isNotEmpty() ) { - navController.navigate(R.id.navigation_setup_extensions, SetupFragmentExtensions.newInstance(false)) + navController.navigate( + R.id.navigation_setup_extensions, + SetupFragmentExtensions.newInstance(false) + ) } } catch (e: Exception) { logError(e) } finally { setKey(HAS_DONE_SETUP_KEY, true) } + +// Used to check current focus for TV +// main { +// while (true) { +// delay(1000) +// println("Current focus: $currentFocus") +// } +// } + /* val relativePath = (Environment.DIRECTORY_DOWNLOADS) + File.separatorChar diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/WebviewFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/WebviewFragment.kt index 81e6e728..4fa2ee92 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/WebviewFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/WebviewFragment.kt @@ -11,8 +11,10 @@ import android.webkit.WebViewClient import androidx.navigation.fragment.findNavController import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.USER_AGENT +import com.lagradost.cloudstream3.syncproviders.AccountManager.Companion.appStringRepo import com.lagradost.cloudstream3.utils.AppUtils.loadRepository import kotlinx.android.synthetic.main.fragment_webview.* +import java.net.URI class WebviewFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -27,10 +29,17 @@ class WebviewFragment : Fragment() { request: WebResourceRequest? ): Boolean { val requestUrl = request?.url.toString() - if (requestUrl.startsWith("https://cs.repo")) { - val realUrl = "https://" + requestUrl.substringAfter("?") - println("Repository url: $realUrl :::: $requestUrl") - activity?.loadRepository(realUrl) + + val repoUrl = if (requestUrl.startsWith("https://cs.repo")) { + "https://" + requestUrl.substringAfter("?") + } else if (URI(requestUrl).scheme == appStringRepo) { + "https://" + requestUrl.replaceFirst(appStringRepo, "https") + } else { + null + } + + if (repoUrl != null) { + activity?.loadRepository(repoUrl) findNavController().popBackStack() return true } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt index 74230638..20f215d2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeFragment.kt @@ -60,8 +60,7 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.deleteAllResumeStateIds import com.lagradost.cloudstream3.utils.DataStoreHelper.removeLastWatched import com.lagradost.cloudstream3.utils.DataStoreHelper.setResultWatchState import com.lagradost.cloudstream3.utils.Event -import com.lagradost.cloudstream3.utils.ExtractorLink -import com.lagradost.cloudstream3.utils.HOMEPAGE_API +import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showOptionSelectStringRes import com.lagradost.cloudstream3.utils.SubtitleHelper.getFlagFromIso import com.lagradost.cloudstream3.utils.UIHelper.dismissSafe @@ -455,8 +454,9 @@ class HomeFragment : Fragment() { homeViewModel.loadStoredData(list) } - private fun loadHomePage(successful: Boolean = true) { - val apiName = context?.getKey(HOMEPAGE_API) + private fun loadHomePage(successful: Boolean = false) { + val apiName = context?.getKey(USER_SELECTED_HOMEPAGE_API) + if (homeViewModel.apiName.value != apiName || apiName == null) { //println("Caught home: " + homeViewModel.apiName.value + " at " + apiName) homeViewModel.loadAndCancel(apiName) @@ -512,7 +512,7 @@ class HomeFragment : Fragment() { observe(homeViewModel.apiName) { apiName -> currentApiName = apiName - setKey(HOMEPAGE_API, apiName) + // setKey(USER_SELECTED_HOMEPAGE_API, apiName) home_api_fab?.text = apiName home_provider_name?.text = apiName try { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt index 7ae0af79..15dd2fc2 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/home/HomeViewModel.kt @@ -31,7 +31,7 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.getBookmarkedData import com.lagradost.cloudstream3.utils.DataStoreHelper.getLastWatched import com.lagradost.cloudstream3.utils.DataStoreHelper.getResultWatchState import com.lagradost.cloudstream3.utils.DataStoreHelper.getViewPos -import com.lagradost.cloudstream3.utils.HOMEPAGE_API +import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API import com.lagradost.cloudstream3.utils.VideoDownloadHelper import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -227,7 +227,8 @@ class HomeViewModel : ViewModel() { expandable.clear() data.value.forEach { home -> home?.items?.forEach { list -> - val filteredList = context?.filterHomePageListByFilmQuality(list) ?: list + val filteredList = + context?.filterHomePageListByFilmQuality(list) ?: list expandable[list.name] = ExpandableHomepageList(filteredList, 1, home.hasNext) } @@ -244,7 +245,9 @@ class HomeViewModel : ViewModel() { .toList() if (currentList.isNotEmpty()) { - val randomItems = context?.filterSearchResultByFilmQuality(currentList.shuffled()) ?: currentList.shuffled() + val randomItems = + context?.filterSearchResultByFilmQuality(currentList.shuffled()) + ?: currentList.shuffled() _randomItems.postValue(randomItems) } @@ -266,18 +269,22 @@ class HomeViewModel : ViewModel() { fun loadAndCancel(preferredApiName: String?) = viewModelScope.launch { val api = getApiFromNameNull(preferredApiName) - if (preferredApiName == noneApi.name) + if (preferredApiName == noneApi.name){ + setKey(USER_SELECTED_HOMEPAGE_API, noneApi.name) loadAndCancel(noneApi) + } else if (preferredApiName == randomApi.name || api == null) { val validAPIs = context?.filterProviderByPreferredMedia() if (validAPIs.isNullOrEmpty()) { + // Do not set USER_SELECTED_HOMEPAGE_API when there is no plugins loaded loadAndCancel(noneApi) } else { val apiRandom = validAPIs.random() loadAndCancel(apiRandom) - setKey(HOMEPAGE_API, apiRandom.name) + setKey(USER_SELECTED_HOMEPAGE_API, apiRandom.name) } } else { + setKey(USER_SELECTED_HOMEPAGE_API, api.name) loadAndCancel(api) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt index 0ede20d7..690d3706 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/CustomSubtitleDecoderFactory.kt @@ -39,6 +39,7 @@ class CustomDecoder : SubtitleDecoder { private var overrideEncoding: String? = null var regexSubtitlesToRemoveCaptions = false var regexSubtitlesToRemoveBloat = false + var uppercaseSubtitles = false val bloatRegex = listOf( Regex( @@ -193,6 +194,9 @@ class CustomDecoder : SubtitleDecoder { bloatRegex.forEach { rgx -> str = str.replace(rgx, "\n") } + if (uppercaseSubtitles) { + str = str.uppercase() + } } inputBuffer.setSubtitleText(str) } diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt index 7e13c292..142b73ab 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/PlayerSubtitleHelper.kt @@ -9,6 +9,7 @@ import com.google.android.exoplayer2.util.MimeTypes import com.lagradost.cloudstream3.SubtitleFile import com.lagradost.cloudstream3.ui.player.CustomDecoder.Companion.regexSubtitlesToRemoveBloat import com.lagradost.cloudstream3.ui.player.CustomDecoder.Companion.regexSubtitlesToRemoveCaptions +import com.lagradost.cloudstream3.ui.player.CustomDecoder.Companion.uppercaseSubtitles import com.lagradost.cloudstream3.ui.subtitles.SaveCaptionStyle import com.lagradost.cloudstream3.ui.subtitles.SubtitlesFragment.Companion.fromSaveToStyle import com.lagradost.cloudstream3.utils.UIHelper.toPx @@ -87,6 +88,7 @@ class PlayerSubtitleHelper { fun setSubStyle(style: SaveCaptionStyle) { regexSubtitlesToRemoveBloat = style.removeBloat + uppercaseSubtitles = style.upperCase regexSubtitlesToRemoveCaptions = style.removeCaptions subtitleView?.context?.let { ctx -> subStyle = style diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt index fd5be423..f011bd40 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsLang.kt @@ -16,7 +16,7 @@ import com.lagradost.cloudstream3.mvvm.logError import com.lagradost.cloudstream3.ui.APIRepository import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.getPref import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar -import com.lagradost.cloudstream3.utils.HOMEPAGE_API +import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showBottomDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showDialog import com.lagradost.cloudstream3.utils.SingleSelectionHelper.showMultiDialog @@ -116,7 +116,7 @@ class SettingsLang : PreferenceFragmentCompat() { .putInt(getString(R.string.prefer_media_type_key), prefValues[it]) .apply() - removeKey(HOMEPAGE_API) + removeKey(USER_SELECTED_HOMEPAGE_API) // (context ?: AcraApplication.context)?.let { ctx -> app.initClient(ctx) } } return@setOnPreferenceClickListener true diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentMedia.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentMedia.kt index cd0c76f5..8d152886 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentMedia.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/setup/SetupFragmentMedia.kt @@ -11,7 +11,7 @@ import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager import com.lagradost.cloudstream3.R import com.lagradost.cloudstream3.utils.DataStore.removeKey -import com.lagradost.cloudstream3.utils.HOMEPAGE_API +import com.lagradost.cloudstream3.utils.USER_SELECTED_HOMEPAGE_API import com.lagradost.cloudstream3.utils.UIHelper.fixPaddingStatusbar import kotlinx.android.synthetic.main.fragment_setup_media.* @@ -52,7 +52,7 @@ class SetupFragmentMedia : Fragment() { .apply() // Regenerate set homepage - removeKey(HOMEPAGE_API) + removeKey(USER_SELECTED_HOMEPAGE_API) } next_btt?.setOnClickListener { diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt index 4d7c9fc1..8095b007 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/subtitles/SubtitlesFragment.kt @@ -38,6 +38,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.hideSystemUI import com.lagradost.cloudstream3.utils.UIHelper.navigate import com.lagradost.cloudstream3.utils.UIHelper.popCurrentPage import kotlinx.android.synthetic.main.subtitle_settings.* +import kotlinx.android.synthetic.main.toast.view.* import java.io.File const val SUBTITLE_KEY = "subtitle_settings" @@ -60,6 +61,8 @@ data class SaveCaptionStyle( @JsonProperty("fixedTextSize") var fixedTextSize: Float?, @JsonProperty("removeCaptions") var removeCaptions: Boolean = false, @JsonProperty("removeBloat") var removeBloat: Boolean = true, + /** Apply caps lock to the text **/ + @JsonProperty("upperCase") var upperCase: Boolean = false, ) const val DEF_SUBS_ELEVATION = 20 @@ -182,6 +185,19 @@ class SubtitlesFragment : Fragment() { private fun Context.updateState() { subtitle_text?.setStyle(fromSaveToStyle(state)) + val text = subtitle_text.context.getString(R.string.subtitles_example_text) + val fixedText = if (state.upperCase) text.uppercase() else text + subtitle_text?.setCues( + listOf( + Cue.Builder() + .setTextSize( + getPixels(TypedValue.COMPLEX_UNIT_SP, 25.0f).toFloat(), + Cue.TEXT_SIZE_TYPE_ABSOLUTE + ) + .setText(fixedText) + .build() + ) + ) } private fun getColor(id: Int): Int { @@ -222,7 +238,6 @@ class SubtitlesFragment : Fragment() { context?.getExternalFilesDir(null)?.absolutePath.toString() + "/Fonts" ) - context?.fixPaddingStatusbar(subs_root) state = getCurrentSavedStyle() @@ -404,6 +419,12 @@ class SubtitlesFragment : Fragment() { subtitles_remove_bloat?.setOnCheckedChangeListener { _, b -> state.removeBloat = b } + subtitles_uppercase?.isChecked = state.upperCase + subtitles_uppercase?.setOnCheckedChangeListener { _, b -> + state.upperCase = b + context?.updateState() + } + subtitles_remove_captions?.isChecked = state.removeCaptions subtitles_remove_captions?.setOnCheckedChangeListener { _, b -> state.removeCaptions = b @@ -418,9 +439,11 @@ class SubtitlesFragment : Fragment() { //Fetch current value from preference context?.let { ctx -> - subtitles_filter_sub_lang?.isChecked = PreferenceManager.getDefaultSharedPreferences(ctx) - .getBoolean(getString(R.string.filter_sub_lang_key), false) + subtitles_filter_sub_lang?.isChecked = + PreferenceManager.getDefaultSharedPreferences(ctx) + .getBoolean(getString(R.string.filter_sub_lang_key), false) } + subtitles_filter_sub_lang?.setOnCheckedChangeListener { _, b -> context?.let { ctx -> PreferenceManager.getDefaultSharedPreferences(ctx) @@ -553,17 +576,5 @@ class SubtitlesFragment : Fragment() { it.context.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(subtitle_text.context.getString(R.string.subtitles_example_text)) - .build() - ) - ) } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt index 190940b5..7102d52a 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt @@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.utils import android.annotation.SuppressLint import android.app.Activity +import android.app.Activity.RESULT_CANCELED import android.content.ContentValues import android.content.Context import android.content.Intent @@ -21,6 +22,7 @@ import android.provider.MediaStore import android.text.Spanned import android.util.Log import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.RequiresApi import androidx.annotation.WorkerThread import androidx.appcompat.app.AppCompatActivity @@ -41,13 +43,11 @@ import com.google.android.gms.cast.framework.CastState import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.wrappers.Wrappers +import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.CommonActivity.showToast import com.lagradost.cloudstream3.MainActivity.Companion.afterRepositoryLoadedEvent -import com.lagradost.cloudstream3.R -import com.lagradost.cloudstream3.SearchResponse -import com.lagradost.cloudstream3.isMovieType -import com.lagradost.cloudstream3.mapper import com.lagradost.cloudstream3.mvvm.logError +import com.lagradost.cloudstream3.mvvm.normalSafeApiCall import com.lagradost.cloudstream3.plugins.RepositoryManager import com.lagradost.cloudstream3.ui.WebviewFragment import com.lagradost.cloudstream3.ui.result.ResultFragment @@ -239,6 +239,7 @@ object AppUtils { ) } } + fun Activity.loadRepository(url: String) { ioSafe { val repo = RepositoryManager.parseRepository(url) ?: return@ioSafe @@ -259,6 +260,18 @@ object AppUtils { } } + private fun Context.hasWebView(): Boolean { + return this.packageManager.hasSystemFeature("android.software.webview") + } + + private fun openWebView(fragment: Fragment?, url: String) { + if (fragment?.context?.hasWebView() == true) + normalSafeApiCall { + fragment + .findNavController() + .navigate(R.id.navigation_webview, WebviewFragment.newInstance(url)) + } + } /** * If fallbackWebview is true and a fragment is supplied then it will open a webview with the url if the browser fails. @@ -266,23 +279,34 @@ object AppUtils { fun Context.openBrowser( url: String, fallbackWebview: Boolean = false, - fragment: Fragment? = null + fragment: Fragment? = null, ) { try { val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse(url) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) - ContextCompat.startActivity(this, intent, null) + + // activityResultRegistry is used to fall back to webview if a browser is missing + // On older versions the startActivity just crashes, but on newer android versions + // You need to check the result to make sure it failed + val activityResultRegistry = fragment?.activity?.activityResultRegistry + if (activityResultRegistry != null) { + activityResultRegistry.register( + url, + ActivityResultContracts.StartActivityForResult() + ) { result -> + if (result.resultCode == RESULT_CANCELED && fallbackWebview) { + openWebView(fragment, url) + } + }.launch(intent) + } else { + ContextCompat.startActivity(this, intent, null) + } + } catch (e: Exception) { logError(e) if (fallbackWebview) { - try { - fragment - ?.findNavController() - ?.navigate(R.id.navigation_webview, WebviewFragment.newInstance(url)) - } catch (e: Exception) { - logError(e) - } + openWebView(fragment, url) } } } diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStore.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStore.kt index ade1fc38..e1cedd39 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/utils/DataStore.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/utils/DataStore.kt @@ -13,7 +13,7 @@ const val DOWNLOAD_HEADER_CACHE = "download_header_cache" //const val WATCH_HEADER_CACHE = "watch_header_cache" const val DOWNLOAD_EPISODE_CACHE = "download_episode_cache" const val VIDEO_PLAYER_BRIGHTNESS = "video_player_alpha_key" -const val HOMEPAGE_API = "home_api_used" +const val USER_SELECTED_HOMEPAGE_API = "home_api_used" const val USER_PROVIDER_API = "user_custom_sites" const val PREFERENCES_NAME = "rebuild_preference" diff --git a/app/src/main/res/layout/fragment_extensions.xml b/app/src/main/res/layout/fragment_extensions.xml index 8dd029be..d02ddc15 100644 --- a/app/src/main/res/layout/fragment_extensions.xml +++ b/app/src/main/res/layout/fragment_extensions.xml @@ -163,7 +163,7 @@ + tools:src="@drawable/ic_baseline_add_24" + android:focusable="true" /> \ No newline at end of file diff --git a/app/src/main/res/layout/subtitle_settings.xml b/app/src/main/res/layout/subtitle_settings.xml index da0c46f2..2491b254 100644 --- a/app/src/main/res/layout/subtitle_settings.xml +++ b/app/src/main/res/layout/subtitle_settings.xml @@ -1,235 +1,248 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + android:id="@+id/subs_root" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="?attr/primaryBlackBackground"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_rowWeight="1" + android:layout_marginTop="20dp" + android:layout_marginBottom="10dp" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:text="@string/subtitles_settings" + android:textColor="?attr/textColor" + android:textSize="20sp" + android:textStyle="bold" /> + android:layout_width="match_parent" + android:layout_height="75sp"> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:contentDescription="@string/preview_background_img_des" + android:scaleType="centerCrop" + android:src="@drawable/subtitles_preview_background" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center" + android:foregroundGravity="center" /> + android:nextFocusRight="@id/cancel_btt" + android:nextFocusDown="@id/subs_font_size" + android:text="@string/subs_font" /> - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + android:layout_height="match_parent" + android:fontFamily="@font/google_sans" + android:nextFocusLeft="@id/apply_btt" + android:nextFocusRight="@id/cancel_btt" + android:nextFocusUp="@id/subs_download_languages" + android:nextFocusDown="@id/subtitles_remove_captions" + android:text="@string/subtitles_remove_bloat" + app:drawableEndCompat="@null" /> + + + + + + + android:gravity="center" + android:text="@string/subs_hold_to_reset_to_default" + android:textColor="?attr/textColor" + android:textSize="14sp" /> + android:id="@+id/subs_import_text" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_rowWeight="1" + android:gravity="center" + android:text="@string/subs_import_text" + android:textColor="?attr/textColor" + android:textSize="14sp" /> + android:layout_width="match_parent" + android:layout_height="60dp" + android:layout_gravity="bottom" + android:gravity="bottom|end" + android:orientation="horizontal"> + android:id="@+id/apply_btt" + style="@style/WhiteButton" + android:layout_width="wrap_content" + android:layout_gravity="center_vertical|end" + android:nextFocusRight="@id/cancel_btt" + android:nextFocusUp="@id/subtitles_remove_captions" + android:text="@string/sort_apply" + android:visibility="visible"> + android:id="@+id/cancel_btt" + style="@style/BlackButton" + android:layout_width="wrap_content" + android:layout_gravity="center_vertical|end" + android:nextFocusLeft="@id/apply_btt" + android:nextFocusUp="@id/subtitles_remove_captions" + android:text="@string/sort_cancel" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a33e2b35..4a910c23 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -601,4 +601,5 @@ Add a repository to install site extensions View community repositories Public list + Uppercase all subtitles