diff --git a/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubProvider.kt index 7b96f89a..77a1b0b5 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubProvider.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubProvider.kt @@ -3,6 +3,7 @@ package com.lagradost.cloudstream3.subtitles import androidx.annotation.WorkerThread import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleEntity import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities.SubtitleSearch +import com.lagradost.cloudstream3.syncproviders.AuthAPI interface AbstractSubProvider { @WorkerThread @@ -14,4 +15,6 @@ interface AbstractSubProvider { suspend fun load(data: SubtitleEntity): String? { throw NotImplementedError() } -} \ No newline at end of file +} + +interface AbstractSubApi : AbstractSubProvider, AuthAPI \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubtitleEntities.kt b/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubtitleEntities.kt index 561cc4f8..e7e5b857 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubtitleEntities.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/subtitles/AbstractSubtitleEntities.kt @@ -9,9 +9,11 @@ class AbstractSubtitleEntities { var lang: String = "en", var data: String = "", //Id or link, depends on provider how to process var type: TvType = TvType.Movie, //Movie, TV series, etc.. + var source: String, var epNumber: Int? = null, var seasonNumber: Int? = null, - var year: Int? = null + var year: Int? = null, + var isHearingImpaired: Boolean = false ) data class SubtitleSearch( diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt index d8c7c869..fd68f940 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/AccountManager.kt @@ -3,10 +3,7 @@ package com.lagradost.cloudstream3.syncproviders import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.AcraApplication.Companion.removeKeys import com.lagradost.cloudstream3.AcraApplication.Companion.setKey -import com.lagradost.cloudstream3.syncproviders.providers.AniListApi -import com.lagradost.cloudstream3.syncproviders.providers.MALApi -import com.lagradost.cloudstream3.syncproviders.providers.NginxApi -import com.lagradost.cloudstream3.syncproviders.providers.OpenSubtitlesApi +import com.lagradost.cloudstream3.syncproviders.providers.* import java.util.concurrent.TimeUnit abstract class AccountManager(private val defIndex: Int) : AuthAPI { @@ -14,6 +11,8 @@ abstract class AccountManager(private val defIndex: Int) : AuthAPI { val malApi = MALApi(0) val aniListApi = AniListApi(0) val openSubtitlesApi = OpenSubtitlesApi(0) + // Removed because of cloudflare +// val indexSubtitlesApi = IndexSubtitleApi() val nginxApi = NginxApi(0) // used to login via app intent @@ -39,7 +38,9 @@ abstract class AccountManager(private val defIndex: Int) : AuthAPI { val subtitleProviders get() = listOf( - openSubtitlesApi + openSubtitlesApi, + // Removed because of cloudflare +// indexSubtitlesApi ) const val appString = "cloudstreamapp" diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/IndexSubtitleApi.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/IndexSubtitleApi.kt index edbfc53b..0d62cbe4 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/IndexSubtitleApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/IndexSubtitleApi.kt @@ -1,13 +1,14 @@ package com.lagradost.cloudstream3.syncproviders.providers import android.util.Log -import com.lagradost.cloudstream3.* -import com.lagradost.cloudstream3.subtitles.AbstractSubProvider +import com.lagradost.cloudstream3.TvType +import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.imdbUrlToIdNullable +import com.lagradost.cloudstream3.subtitles.AbstractSubApi import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities -import com.lagradost.cloudstream3.syncproviders.AuthAPI import com.lagradost.cloudstream3.utils.SubtitleHelper -class IndexSubtitleApi : AuthAPI, AbstractSubProvider { +class IndexSubtitleApi : AbstractSubApi { override val name = "IndexSubtitle" override val idPrefix = "indexsubtitle" override val requiresLogin = false @@ -42,7 +43,7 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { } } - private fun getOrdinal(num: Int?) : String? { + private fun getOrdinal(num: Int?): String? { return when (num) { 1 -> "First" 2 -> "Second" @@ -83,13 +84,15 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { } } - private fun isRightEps(text: String, seasonNum: Int?, epNum: Int?) : Boolean { - val FILTER_EPS_REGEX = Regex("(?i)((Chapter\\s?0?${epNum})|((Season)?\\s?0?${seasonNum}?\\s?(Episode)\\s?0?${epNum}[^0-9]))|(?i)((S?0?${seasonNum}?E0?${epNum}[^0-9])|(0?${seasonNum}[a-z]0?${epNum}[^0-9]))") + private fun isRightEps(text: String, seasonNum: Int?, epNum: Int?): Boolean { + val FILTER_EPS_REGEX = + Regex("(?i)((Chapter\\s?0?${epNum})|((Season)?\\s?0?${seasonNum}?\\s?(Episode)\\s?0?${epNum}[^0-9]))|(?i)((S?0?${seasonNum}?E0?${epNum}[^0-9])|(0?${seasonNum}[a-z]0?${epNum}[^0-9]))") return text.contains(FILTER_EPS_REGEX) } - private fun haveEps(text: String) : Boolean { - val HAVE_EPS_REGEX = Regex("(?i)((Chapter\\s?0?\\d)|((Season)?\\s?0?\\d?\\s?(Episode)\\s?0?\\d))|(?i)((S?0?\\d?E0?\\d)|(0?\\d[a-z]0?\\d))") + private fun haveEps(text: String): Boolean { + val HAVE_EPS_REGEX = + Regex("(?i)((Chapter\\s?0?\\d)|((Season)?\\s?0?\\d?\\s?(Episode)\\s?0?\\d))|(?i)((S?0?\\d?E0?\\d)|(0?\\d[a-z]0?\\d))") return text.contains(HAVE_EPS_REGEX) } @@ -104,13 +107,18 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { val urlItems = ArrayList() - fun cleanResources(results: MutableList, name: String, link: String) { + fun cleanResources( + results: MutableList, + name: String, + link: String + ) { results.add( AbstractSubtitleEntities.SubtitleEntity( idPrefix = idPrefix, name = name, lang = queryLang.toString(), data = link, + source = this.name, type = if (seasonNum > 0) TvType.TvSeries else TvType.Movie, epNumber = epNum, seasonNumber = seasonNum, @@ -152,11 +160,13 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { it.selectFirst("a")!!.attr("href") ) val itemDoc = app.get(urlItem).document - val id = imdbUrlToIdNullable(itemDoc.selectFirst("div.d-flex span.badge.badge-primary")?.parent() - ?.attr("href"))?.toLongOrNull() + val id = imdbUrlToIdNullable( + itemDoc.selectFirst("div.d-flex span.badge.badge-primary")?.parent() + ?.attr("href") + )?.toLongOrNull() val year = itemDoc.selectFirst("div.d-flex span.badge.badge-success") - ?.ownText() - ?.trim().toString() + ?.ownText() + ?.trim().toString() Log.i(TAG, "id => $id \nyear => $year||$yearNum") if (imdbId > 0) { if (id == imdbId) { @@ -191,12 +201,13 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { val request = app.get(url) if (request.isSuccessful) { request.document.select("div.my-3.p-3 div.media").map { block -> - if (block.select("span.d-block span[data-original-title=Language]").text().trim() + if (block.select("span.d-block span[data-original-title=Language]").text() + .trim() .contains("$queryLang") ) { var name = block.select("strong.text-primary").text().trim() val link = fixUrl(block.selectFirst("a")!!.attr("href")) - if(seasonNum > 0) { + if (seasonNum > 0) { when { isRightEps(name, seasonNum, epNum) -> { cleanResources(results, name, link) @@ -222,7 +233,7 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { val req = app.get(data.data) - if(req.isSuccessful) { + if (req.isSuccessful) { val document = req.document val link = if (document.select("div.my-3.p-3 div.media").size == 1) { fixUrl( @@ -230,7 +241,8 @@ class IndexSubtitleApi : AuthAPI, AbstractSubProvider { ) } else { document.select("div.my-3.p-3 div.media").mapNotNull { block -> - val name = block.selectFirst("strong.d-block.text-primary")?.text()?.trim().toString() + val name = + block.selectFirst("strong.d-block.text-primary")?.text()?.trim().toString() if (seasonNum!! > 0) { if (isRightEps(name, seasonNum, epNum)) { fixUrl(block.selectFirst("a")!!.attr("href")) diff --git a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/OpenSubtitlesApi.kt b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/OpenSubtitlesApi.kt index ae0c86e4..43fcf852 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/OpenSubtitlesApi.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/syncproviders/providers/OpenSubtitlesApi.kt @@ -2,22 +2,19 @@ package com.lagradost.cloudstream3.syncproviders.providers import android.util.Log import com.fasterxml.jackson.annotation.JsonProperty +import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.AcraApplication.Companion.getKey import com.lagradost.cloudstream3.AcraApplication.Companion.removeKey import com.lagradost.cloudstream3.AcraApplication.Companion.setKey -import com.lagradost.cloudstream3.ErrorLoadingException -import com.lagradost.cloudstream3.R -import com.lagradost.cloudstream3.TvType -import com.lagradost.cloudstream3.app import com.lagradost.cloudstream3.mvvm.logError -import com.lagradost.cloudstream3.subtitles.AbstractSubProvider +import com.lagradost.cloudstream3.subtitles.AbstractSubApi import com.lagradost.cloudstream3.subtitles.AbstractSubtitleEntities import com.lagradost.cloudstream3.syncproviders.AuthAPI import com.lagradost.cloudstream3.syncproviders.InAppAuthAPI import com.lagradost.cloudstream3.syncproviders.InAppAuthAPIManager import com.lagradost.cloudstream3.utils.AppUtils -class OpenSubtitlesApi(index: Int) : InAppAuthAPIManager(index), AbstractSubProvider { +class OpenSubtitlesApi(index: Int) : InAppAuthAPIManager(index), AbstractSubApi { override val idPrefix = "opensubtitles" override val name = "OpenSubtitles" override val icon = R.drawable.open_subtitles_icon @@ -190,6 +187,7 @@ class OpenSubtitlesApi(index: Int) : InAppAuthAPIManager(index), AbstractSubProv val resSeasonNum = featureDetails?.seasonNumber ?: query.seasonNumber val year = featureDetails?.year ?: query.year val type = if ((resSeasonNum ?: 0) > 0) TvType.TvSeries else TvType.Movie + val isHearingImpaired = attr.hearing_impaired ?: false //Log.i(TAG, "Result id/name => ${item.id} / $name") item.attributes?.files?.forEach { file -> val resultData = file.fileId?.toString() ?: "" @@ -201,9 +199,11 @@ class OpenSubtitlesApi(index: Int) : InAppAuthAPIManager(index), AbstractSubProv lang = lang, data = resultData, type = type, + source = this.name, epNumber = resEpNum, seasonNumber = resSeasonNum, - year = year + year = year, + isHearingImpaired = isHearingImpaired ) ) } @@ -277,7 +277,8 @@ class OpenSubtitlesApi(index: Int) : InAppAuthAPIManager(index), AbstractSubProv @JsonProperty("release") var release: String? = null, @JsonProperty("url") var url: String? = null, @JsonProperty("files") var files: List? = listOf(), - @JsonProperty("feature_details") var featDetails: ResultFeatureDetails? = ResultFeatureDetails() + @JsonProperty("feature_details") var featDetails: ResultFeatureDetails? = ResultFeatureDetails(), + @JsonProperty("hearing_impaired") var hearing_impaired: Boolean? = null, ) data class ResultFiles( diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt index 24a87cde..d2502269 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/ui/player/GeneratorPlayer.kt @@ -13,6 +13,7 @@ import android.view.ViewGroup import android.widget.* import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat import androidx.core.view.isGone import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider @@ -216,25 +217,80 @@ class GeneratorPlayer : FullScreenPlayer() { dismissCallback: (() -> Unit) ) { val providers = subsProviders + val isSingleProvider = subsProviders.size == 1 val dialog = Dialog(context, R.style.AlertDialogCustomBlack) dialog.setContentView(R.layout.dialog_online_subtitles) + var currentSubtitles: List = emptyList() + var currentSubtitle: AbstractSubtitleEntities.SubtitleEntity? = null + + fun getName(entry: AbstractSubtitleEntities.SubtitleEntity, withLanguage: Boolean): String { + if (entry.lang.isBlank() || !withLanguage) { + return entry.name + } + val language = fromTwoLettersToLanguage(entry.lang.trim()) ?: entry.lang + return "$language ${entry.name}" + } + + val layout = R.layout.sort_bottom_single_choice_double_text val arrayAdapter = - ArrayAdapter(dialog.context, R.layout.sort_bottom_single_choice) + object : ArrayAdapter(dialog.context, layout) { + fun setHearingImpairedIcon( + imageViewEnd: ImageView?, + position: Int + ) { + if (imageViewEnd == null) return + val isHearingImpaired = + currentSubtitles.getOrNull(position)?.isHearingImpaired ?: false + + val drawableEnd = if (isHearingImpaired) { + ContextCompat.getDrawable( + context, + R.drawable.ic_baseline_hearing_24 + )?.apply { + setTint( + ContextCompat.getColor( + context, + R.color.textColor + ) + ) + } + } else null + + imageViewEnd.setImageDrawable(drawableEnd) + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + val view = convertView ?: LayoutInflater.from(context) + .inflate(layout, null) + + val item = getItem(position) + + val mainTextView = view.findViewById(R.id.main_text) + val secondaryTextView = view.findViewById(R.id.secondary_text) + val drawableEnd = view.findViewById(R.id.drawable_end) + + mainTextView?.text = item?.let { getName(it, false) } + + val language = item?.let { fromTwoLettersToLanguage(it.lang.trim()) ?: it.lang } ?: "" + val providerSuffix = if (isSingleProvider || item == null) "" else " · ${item.source}" + secondaryTextView?.text = language + providerSuffix + + setHearingImpairedIcon(drawableEnd, position) + return view + } + } dialog.show() - dialog.cancel_btt.setOnClickListener { dialog.dismissSafe() } dialog.subtitle_adapter.choiceMode = AbsListView.CHOICE_MODE_SINGLE dialog.subtitle_adapter.adapter = arrayAdapter - val adapter = dialog.subtitle_adapter.adapter as? ArrayAdapter - - var currentSubtitles: List = emptyList() - var currentSubtitle: AbstractSubtitleEntities.SubtitleEntity? = null + val adapter = + dialog.subtitle_adapter.adapter as? ArrayAdapter dialog.subtitle_adapter.setOnItemClickListener { _, _, position, _ -> currentSubtitle = currentSubtitles.getOrNull(position) ?: return@setOnItemClickListener @@ -242,19 +298,11 @@ class GeneratorPlayer : FullScreenPlayer() { var currentLanguageTwoLetters: String = getAutoSelectLanguageISO639_1() - fun getName(entry: AbstractSubtitleEntities.SubtitleEntity): String { - return if (entry.lang.isBlank()) { - entry.name - } else { - val language = fromTwoLettersToLanguage(entry.lang.trim()) ?: entry.lang - return "$language ${entry.name}" - } - } fun setSubtitlesList(list: List) { currentSubtitles = list adapter?.clear() - adapter?.addAll(currentSubtitles.map { getName(it) }) + adapter?.addAll(currentSubtitles) } val currentTempMeta = getMetaData() @@ -328,7 +376,7 @@ class GeneratorPlayer : FullScreenPlayer() { ioSafe { val url = api.load(currentSubtitle) ?: return@ioSafe val subtitle = SubtitleData( - name = getName(currentSubtitle), + name = getName(currentSubtitle, true), url = url, origin = SubtitleOrigin.URL, mimeType = url.toSubtitleMimeType() @@ -846,7 +894,11 @@ class GeneratorPlayer : FullScreenPlayer() { if (season == null) " - ${ctx.getString(R.string.episode)} $episode" else - " \"${ctx.getString(R.string.season_short)}${season}:${ctx.getString(R.string.episode_short)}${episode}\"" + " \"${ctx.getString(R.string.season_short)}${season}:${ + ctx.getString( + R.string.episode_short + ) + }${episode}\"" else "") + if (subName.isNullOrBlank() || subName == headerName) "" else " - $subName" } else { "" diff --git a/app/src/main/res/drawable/ic_baseline_check_24_listview.xml b/app/src/main/res/drawable/ic_baseline_check_24_listview.xml new file mode 100644 index 00000000..d96cc087 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_check_24_listview.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_hearing_24.xml b/app/src/main/res/drawable/ic_baseline_hearing_24.xml new file mode 100644 index 00000000..995d874b --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_hearing_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/layout/sort_bottom_single_choice_double_text.xml b/app/src/main/res/layout/sort_bottom_single_choice_double_text.xml new file mode 100644 index 00000000..af5a3982 --- /dev/null +++ b/app/src/main/res/layout/sort_bottom_single_choice_double_text.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-vi/array.xml b/app/src/main/res/values-vi/array.xml new file mode 100644 index 00000000..243b1313 --- /dev/null +++ b/app/src/main/res/values-vi/array.xml @@ -0,0 +1,362 @@ + + + + @id/cast_button_type_rewind_30_seconds + @id/cast_button_type_play_pause_toggle + @id/cast_button_type_forward_30_seconds + + + + @id/cast_button_type_rewind_30_seconds + @id/cast_button_type_rewind_30_seconds + @id/cast_button_type_forward_30_seconds + + @id/cast_button_type_forward_30_seconds + + + + @string/none + Google + Cloudflare + + AdGuard + + + 0 + 1 + 2 + + 4 + + + + Tất cả + Phim lẻ và Phim bộ + Anime + Phim tài liệu + + + 0 + 1 + 2 + 3 + + + + @string/resolution_and_title + @string/title + @string/resolution + @string/none + + + + 3 + 2 + 1 + 0 + + + + @string/none + 16 ký tự + 32 ký tự + 64 ký tự + 128 ký tự + Ẩn Tiêu đề + + + 0 + 16 + 32 + 64 + 128 + -1 + + + + 5 + 10 + 15 + 20 + 25 + 30 + + + + @string/automatic + 1 phút + 1 phút 30 giây + 2 phút + 2 phút 30 giây + 3 phút + 3 phút 30 giây + 4 phút + 5 phút + 6 phút + 7 phút + 8 phút + 9 phút + 10 phút + 15 phút + 20 phút + 30 phút + + + + 0 + 60 + 90 + 120 + 150 + 180 + 210 + 240 + 300 + 360 + 420 + 480 + 540 + 600 + 900 + 1200 + 1800 + + + + @string/automatic + 10MB + 20MB + 30MB + 40MB + 50MB + 60MB + 70MB + 80MB + 90MB + 100MB + 150MB + 200MB + 250MB + 300MB + 350MB + 400MB + 450MB + 500MB + + + + 0 + 10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + 90 + 100 + 150 + 200 + 250 + 300 + 350 + 400 + 450 + 500 + + + + @string/show_hd + @string/show_dub + @string/show_sub + @string/show_title + + + + @string/show_hd_key + @string/show_dub_key + @string/show_sub_key + @string/show_title_key + + + + @string/episode_action_chromecast_episode + @string/episode_action_chromecast_mirror + @string/episode_action_play_in_app + @string/episode_action_play_in_vlc + @string/episode_action_play_in_browser + @string/episode_action_copy_link + @string/episode_action_auto_download + @string/episode_action_download_mirror + @string/episode_action_download_subtitle + @string/episode_action_reload_links + + + + 4 + 5 + 1 + 2 + 3 + 9 + 6 + 7 + 13 + 8 + + + + @string/automatic + @string/phone_layout + @string/tv_layout + @string/emulator_layout + + + + -1 + 0 + 1 + 2 + + + + Mặc định + Hồng nhạt + Xanh lam đậm + Nâu sẫm + Xanh lục + Xám + Trắng + Nâu + Xanh lục nhạt + Đỏ + Tím + Xanh lam + Xanh lam nhạt + Vàng + Hồng + Hồng đậm + + + Normal + CarnationPink + DarkGreen + Maroon + NavyBlue + Grey + White + Brown + Blue + Red + Purple + Green + GreenApple + Banana + Party + Pink + + + + Tối + Xám + Amoled + Flashbang + + + AmoledLight + Black + Amoled + Light + + + + + @string/automatic + Universal (UTF-8) + Universal (UTF-16) + Universal (big endian UTF-16) + Universal (little endian UTF-16) + Universal, Chinese (GB18030) + Western European (Latin-9) + Western European (Windows-1252) + Western European (IBM 00850) + Eastern European (Latin-2) + Eastern European (Windows-1250) + Esperanto (Latin-3) + Nordic (Latin-6) + Cyrillic (Windows-1251) + Russian (KOI8-R) + Ukrainian (KOI8-U) + Arabic (ISO 8859-6) + Arabic (Windows-1256) + Greek (ISO 8859-7) + Greek (Windows-1253) + Hebrew (ISO 8859-8) + Hebrew (Windows-1255) + Turkish (ISO 8859-9) + Turkish (Windows-1254) + Thai (TIS 620-2533/ISO 8859-11) + Thai (Windows-874) + Baltic (Latin-7) + Baltic (Windows-1257) + Celtic (Latin-8) + South-Eastern European (Latin-10) + Simplified Chinese (ISO-2022-CN-EXT) + Simplified Chinese Unix (EUC-CN) + Japanese (7-bits JIS/ISO-2022-JP-2) + Japanese Unix (EUC-JP) + Japanese (Shift JIS) + Korean (EUC-KR/CP949) + Korean (ISO-2022-KR) + Traditional Chinese (Big5) + Traditional Chinese Unix (EUC-TW) + Hong-Kong Supplementary (HKSCS) + Vietnamese (VISCII) + Vietnamese (Windows-1258) + + + + UTF-8 + UTF-16 + UTF-16BE + UTF-16LE + GB18030 + ISO-8859-15 + Windows-1252 + IBM850 + ISO-8859-2 + Windows-1250 + ISO-8859-3 + ISO-8859-10 + Windows-1251 + KOI8-R + KOI8-U + ISO-8859-6 + Windows-1256 + ISO-8859-7 + Windows-1253 + ISO-8859-8 + Windows-1255 + ISO-8859-9 + Windows-1254 + ISO-8859-11 + Windows-874 + ISO-8859-13 + Windows-1257 + ISO-8859-14 + ISO-8859-16 + ISO-2022-CN-EXT + EUC-CN + ISO-2022-JP-2 + EUC-JP + Shift_JIS + CP949 + ISO-2022-KR + Big5 + ISO-2022-TW + Big5-HKSCS + VISCII + Windows-1258 + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index dffb1461..c4ee24e3 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -462,8 +462,9 @@ marquee ?attr/selectableItemBackgroundBorderless 20dp - @color/check_selection_color - @drawable/ic_baseline_check_24 + + + @drawable/ic_baseline_check_24_listview