From b03a948029815c6ad0359b0bc94d1839a5eac1e9 Mon Sep 17 00:00:00 2001 From: okjack Date: Sat, 11 May 2024 13:01:50 +0800 Subject: [PATCH 1/5] SettingActivity --- .../tv/ui/activity/SettingActivity.java | 25 -------- .../tv/ui/activity/SettingCustomActivity.java | 22 +++++++ .../leanback/res/layout/activity_setting.xml | 58 ------------------- .../res/layout/activity_setting_custom.xml | 58 +++++++++++++++++++ 4 files changed, 80 insertions(+), 83 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 72903ea5c..26debef41 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -7,9 +7,7 @@ import android.view.View; import androidx.viewbinding.ViewBinding; -import com.fongmi.android.tv.App; import com.fongmi.android.tv.BuildConfig; -import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.Updater; import com.fongmi.android.tv.api.config.LiveConfig; @@ -37,12 +35,9 @@ import com.fongmi.android.tv.ui.dialog.ProxyDialog; import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; -import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.bean.Doh; import com.github.catvod.net.OkHttp; -import com.github.catvod.utils.Shell; -import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.permissionx.guolindev.PermissionX; import java.util.ArrayList; @@ -52,7 +47,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit private ActivitySettingBinding mBinding; private int type; - private String[] configCache; public static void start(Activity activity) { activity.startActivity(new Intent(activity, SettingActivity.class)); @@ -84,7 +78,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.versionText.setText(BuildConfig.VERSION_NAME); mBinding.proxyText.setText(UrlUtil.scheme(Setting.getProxy())); mBinding.aboutText.setText(BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi); - mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]); setCacheText(); } @@ -122,8 +115,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.wallRefresh.setOnClickListener(this::setWallRefresh); mBinding.custom.setOnClickListener(this::onCustom); mBinding.doh.setOnClickListener(this::setDoh); - mBinding.configCache.setOnClickListener(this::setConfigCache); - mBinding.reset.setOnClickListener(this::onReset); } @Override @@ -289,22 +280,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit SettingCustomActivity.start(this); } - private void setConfigCache(View view) { - int index = Setting.getConfigCache(); - Setting.putConfigCache(index = index == configCache.length - 1 ? 0 : ++index); - mBinding.configCacheText.setText(configCache[index]); - } - - private void onReset(View view) { - new MaterialAlertDialogBuilder(this).setTitle(R.string.dialog_reset_app).setMessage(R.string.dialog_reset_app_data).setNegativeButton(R.string.dialog_negative, null).setPositiveButton(R.string.dialog_positive, (dialog, which) -> reset()).show(); - } - - private void reset() { - new Thread(() -> { - Shell.exec("pm clear " + App.get().getPackageName()); - }).start(); - } - private void setDoh(View view) { DohDialog.create(this).index(getDohIndex()).show(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java index f4fce8df2..f398ced68 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java @@ -18,6 +18,8 @@ import com.fongmi.android.tv.ui.dialog.LanguageDialog; import com.fongmi.android.tv.ui.dialog.MenuKeyDialog; import com.fongmi.android.tv.ui.dialog.X5WebViewDialog; import com.fongmi.android.tv.utils.ResUtil; +import com.github.catvod.utils.Shell; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.tencent.smtt.sdk.QbSdk; import java.util.Locale; @@ -31,6 +33,7 @@ public class SettingCustomActivity extends BaseActivity { private String[] smallWindowBackKey; private String[] homeUI; private String[] parseWebview; + private String[] configCache; @Override protected ViewBinding getBinding() { @@ -62,6 +65,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeHistoryText.setText(getSwitch(Setting.isHomeHistory())); mBinding.languageText.setText((ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]); mBinding.parseWebviewText.setText((parseWebview = ResUtil.getStringArray(R.array.select_parse_webview))[Setting.getParseWebView()]); + mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]); } @Override @@ -83,6 +87,8 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeHistory.setOnClickListener(this::setHomeHistory); mBinding.setLanguage.setOnClickListener(this::setLanguage); mBinding.parseWebview.setOnClickListener(this::setParseWebview); + mBinding.configCache.setOnClickListener(this::setConfigCache); + mBinding.reset.setOnClickListener(this::onReset); } @@ -194,4 +200,20 @@ public class SettingCustomActivity extends BaseActivity { if (index == 1 && QbSdk.getTbsVersion(App.get()) <= 0) X5WebViewDialog.create(this).show(); } + private void setConfigCache(View view) { + int index = Setting.getConfigCache(); + Setting.putConfigCache(index = index == configCache.length - 1 ? 0 : ++index); + mBinding.configCacheText.setText(configCache[index]); + } + + private void onReset(View view) { + new MaterialAlertDialogBuilder(this).setTitle(R.string.dialog_reset_app).setMessage(R.string.dialog_reset_app_data).setNegativeButton(R.string.dialog_negative, null).setPositiveButton(R.string.dialog_positive, (dialog, which) -> reset()).show(); + } + + private void reset() { + new Thread(() -> { + Shell.exec("pm clear " + App.get().getPackageName()); + }).start(); + } + } diff --git a/app/src/leanback/res/layout/activity_setting.xml b/app/src/leanback/res/layout/activity_setting.xml index 297e495c7..ecbdaa19b 100644 --- a/app/src/leanback/res/layout/activity_setting.xml +++ b/app/src/leanback/res/layout/activity_setting.xml @@ -319,64 +319,6 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + \ No newline at end of file From faad1142b772771c790c983221b9219ca4cdb39d Mon Sep 17 00:00:00 2001 From: okjack Date: Sat, 11 May 2024 13:08:45 +0800 Subject: [PATCH 2/5] update --- app/src/leanback/res/layout/adapter_func_horizontal.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/leanback/res/layout/adapter_func_horizontal.xml b/app/src/leanback/res/layout/adapter_func_horizontal.xml index 858476414..d27d711f7 100644 --- a/app/src/leanback/res/layout/adapter_func_horizontal.xml +++ b/app/src/leanback/res/layout/adapter_func_horizontal.xml @@ -1,7 +1,7 @@ Date: Sat, 11 May 2024 15:27:14 +0800 Subject: [PATCH 3/5] update --- .../com/fongmi/android/tv/ui/activity/SettingActivity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 26debef41..a99f141b1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -115,6 +115,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.wallRefresh.setOnClickListener(this::setWallRefresh); mBinding.custom.setOnClickListener(this::onCustom); mBinding.doh.setOnClickListener(this::setDoh); + mBinding.about.setOnClickListener(this::onAbout); } @Override @@ -280,6 +281,10 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit SettingCustomActivity.start(this); } + private void onAbout(View view) { + mBinding.aboutText.setText(BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi); + } + private void setDoh(View view) { DohDialog.create(this).index(getDohIndex()).show(); } From e51d5bf971e3af11866474eb72b373a2da746690 Mon Sep 17 00:00:00 2001 From: okjack Date: Sun, 12 May 2024 18:30:04 +0800 Subject: [PATCH 4/5] m3u8 remove ads --- .../tv/ui/activity/SettingCustomActivity.java | 7 ++++ .../res/layout/activity_setting_custom.xml | 37 +++++++++++++++++ .../java/com/fongmi/android/tv/Setting.java | 9 ++++- .../com/fongmi/android/tv/player/ExoUtil.java | 5 ++- .../com/fongmi/android/tv/player/IjkUtil.java | 5 +-- .../com/fongmi/android/tv/utils/M3U8.java | 40 +------------------ app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 3 +- app/src/main/res/values/strings.xml | 1 + .../tv/ui/fragment/SettingCustomFragment.java | 7 ++++ .../res/layout/fragment_setting_custom.xml | 27 +++++++++++++ 11 files changed, 96 insertions(+), 46 deletions(-) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java index f398ced68..4ee5cf4c0 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingCustomActivity.java @@ -63,6 +63,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.aggregatedSearchText.setText(getSwitch(Setting.isAggregatedSearch())); mBinding.homeUIText.setText((homeUI = ResUtil.getStringArray(R.array.select_home_ui))[Setting.getHomeUI()]); mBinding.homeHistoryText.setText(getSwitch(Setting.isHomeHistory())); + mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd())); mBinding.languageText.setText((ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]); mBinding.parseWebviewText.setText((parseWebview = ResUtil.getStringArray(R.array.select_parse_webview))[Setting.getParseWebView()]); mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]); @@ -85,6 +86,7 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeUI.setOnClickListener(this::setHomeUI); mBinding.homeButtons.setOnClickListener(this::onHomeButtons); mBinding.homeHistory.setOnClickListener(this::setHomeHistory); + mBinding.removeAd.setOnClickListener(this::setRemoveAd); mBinding.setLanguage.setOnClickListener(this::setLanguage); mBinding.parseWebview.setOnClickListener(this::setParseWebview); mBinding.configCache.setOnClickListener(this::setConfigCache); @@ -184,6 +186,11 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeHistoryText.setText(getSwitch(Setting.isHomeHistory())); } + private void setRemoveAd(View view) { + Setting.putRemoveAd(!Setting.isRemoveAd()); + mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd())); + } + private void setLanguage(View view) { LanguageDialog.create(this).show(); } diff --git a/app/src/leanback/res/layout/activity_setting_custom.xml b/app/src/leanback/res/layout/activity_setting_custom.xml index abeed7b17..8953447d7 100644 --- a/app/src/leanback/res/layout/activity_setting_custom.xml +++ b/app/src/leanback/res/layout/activity_setting_custom.xml @@ -588,5 +588,42 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java index 9ebdf683e..68d890cf7 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -8,8 +8,6 @@ import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.utils.LanguageUtil; import com.github.catvod.utils.Prefers; -import java.util.Locale; - public class Setting { public static String getDoh() { @@ -496,5 +494,12 @@ public class Setting { return Prefers.getInt("parse_webview", 0); } + public static boolean isRemoveAd() { + return Prefers.getBoolean("remove_ad", false); + } + + public static void putRemoveAd(boolean remove) { + Prefers.put("remove_ad", remove); + } } diff --git a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java index 64a7dd461..8f72cf86b 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java @@ -44,13 +44,14 @@ import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Drm; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.bean.Sub; -import com.fongmi.android.tv.utils.Sniffer; +import com.fongmi.android.tv.server.Server; import com.fongmi.android.tv.utils.UrlUtil; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Path; import com.github.catvod.utils.Util; import com.google.common.net.HttpHeaders; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -140,6 +141,7 @@ public class ExoUtil { String mimeType = getMimeType(format, errorCode); if (uri.getUserInfo() != null) headers.put(HttpHeaders.AUTHORIZATION, Util.basic(uri.getUserInfo())); if (url.contains("***") && url.contains("|||")) return getConcat(headers, url, format, subs, sub, drm, errorCode); + if (url.contains(".m3u8") && Setting.isRemoveAd()) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(url))); return new DefaultMediaSourceFactory(getDataSourceFactory(headers), getExtractorsFactory()).createMediaSource(getMediaItem(uri, mimeType, subs, drm)); } @@ -160,7 +162,6 @@ public class ExoUtil { if (drm != null) builder.setDrmConfiguration(drm.get()); builder.setAllowChunklessPreparation(Players.isHard(Players.EXO)); if (mimeType != null) builder.setMimeType(mimeType); - builder.setAds(Sniffer.getRegex(uri)); return builder.build(); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java index 4461eb76a..439675734 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/player/IjkUtil.java @@ -2,10 +2,10 @@ package com.fongmi.android.tv.player; import android.net.Uri; +import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.bean.Channel; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.server.Server; -import com.fongmi.android.tv.utils.Sniffer; import com.fongmi.android.tv.utils.UrlUtil; import java.net.URLEncoder; @@ -25,8 +25,7 @@ public class IjkUtil { public static MediaSource getSource(Map headers, String url) { Uri uri = UrlUtil.uri(url); - boolean m3u8Ad = Sniffer.getRegex(uri).size() > 0; - if (m3u8Ad) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(uri.toString()))); + if (url.contains(".m3u8") && Setting.isRemoveAd()) uri = Uri.parse(Server.get().getAddress().concat("/m3u8?url=").concat(URLEncoder.encode(url))); return new MediaSource(Players.checkUa(headers), uri); } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java index f1b056469..613796579 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/M3U8.java @@ -1,6 +1,5 @@ package com.fongmi.android.tv.utils; -import android.net.Uri; import android.text.TextUtils; import androidx.media3.common.util.UriUtil; @@ -8,8 +7,6 @@ import androidx.media3.common.util.UriUtil; import com.github.catvod.net.OkHttp; import com.google.common.net.HttpHeaders; -import java.math.BigDecimal; -import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -18,14 +15,7 @@ import okhttp3.Headers; import okhttp3.Response; public class M3U8 { - - private static final String TAG_DISCONTINUITY = "#EXT-X-DISCONTINUITY"; - private static final String TAG_MEDIA_DURATION = "#EXTINF"; - private static final String TAG_ENDLIST = "#EXT-X-ENDLIST"; private static final String TAG_KEY = "#EXT-X-KEY"; - - private static final Pattern REGEX_X_DISCONTINUITY = Pattern.compile("#EXT-X-DISCONTINUITY[\\s\\S]*?(?=#EXT-X-DISCONTINUITY|$)"); - private static final Pattern REGEX_MEDIA_DURATION = Pattern.compile(TAG_MEDIA_DURATION + ":([\\d\\.]+)\\b"); private static final Pattern REGEX_URI = Pattern.compile("URI=\"(.+?)\""); public static String get(String url, Map headers) { @@ -38,31 +28,13 @@ public class M3U8 { if (matcher.find() && matcher.groupCount() > 1) return get(UriUtil.resolve(url, matcher.group(2)), headers); StringBuilder sb = new StringBuilder(); for (String line : result.split("\n")) sb.append(shouldResolve(line) ? resolve(url, line) : line).append("\n"); - List ads = Sniffer.getRegex(Uri.parse(url)); - return clean(sb.toString(), ads); + return clean(sb.toString()); } catch (Throwable ignored) { return ""; } } - private static String clean(String line, List ads) { - boolean scan = false; - for (String ad : ads) { - if (ad.contains(TAG_DISCONTINUITY) || ad.contains(TAG_MEDIA_DURATION)) line = line.replaceAll(ad, ""); - else if (isDouble(ad)) scan = true; - } - return scan ? scan(line, ads) : line; - } - - private static String scan(String line, List ads) { - Matcher m1 = REGEX_X_DISCONTINUITY.matcher(line); - while (m1.find()) { - String group = m1.group(); - BigDecimal t = BigDecimal.ZERO; - Matcher m2 = REGEX_MEDIA_DURATION.matcher(group); - while (m2.find()) t = t.add(new BigDecimal(m2.group(1))); - for (String ad : ads) if (t.toString().startsWith(ad)) line = line.replace(group.replace(TAG_ENDLIST, ""), ""); - } + private static String clean(String line) { return line; } @@ -73,14 +45,6 @@ public class M3U8 { return builder.build(); } - private static boolean isDouble(String ad) { - try { - return Double.parseDouble(ad) > 0; - } catch (Exception e) { - return false; - } - } - private static boolean shouldResolve(String line) { return (!line.startsWith("#") && !line.startsWith("http")) || line.startsWith(TAG_KEY); } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1b7f7cb31..b1a16ced5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -86,6 +86,7 @@ 首页菜单键 首页源锁定 无痕模式 + AI去广告 小窗返回键 首页显示站源 首页UI diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 4897a7e3f..5a1dd4df9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -86,8 +86,9 @@ 首頁選單鍵 首頁源鎖定 無痕模式 + AI去廣告 小窗返回鍵 - 首頁显示站源 + 首頁顯示站源 首頁UI 首頁按鈕 DoH diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f71105a9..2e00bf8a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,6 +86,7 @@ Home menu key Home site lock Incognito mode + Remove ads Small window back key Home display name Home ui style diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java index 2a6ec3a66..6beebcd39 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingCustomFragment.java @@ -49,6 +49,7 @@ public class SettingCustomFragment extends BaseFragment { mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); mBinding.aggregatedSearchText.setText(getSwitch(Setting.isAggregatedSearch())); mBinding.homeDisplayNameText.setText(getSwitch(Setting.isHomeDisplayName())); + mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd())); mBinding.languageText.setText((lang = ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]); mBinding.configCacheText.setText((configCache = ResUtil.getStringArray(R.array.select_config_cache))[Setting.getConfigCache()]); } @@ -63,6 +64,7 @@ public class SettingCustomFragment extends BaseFragment { mBinding.incognito.setOnClickListener(this::setIncognito); mBinding.aggregatedSearch.setOnClickListener(this::setAggregatedSearch); mBinding.homeDisplayName.setOnClickListener(this::setHomeDisplayName); + mBinding.removeAd.setOnClickListener(this::setRemoveAd); mBinding.language.setOnClickListener(this::setLanguage); mBinding.configCache.setOnClickListener(this::setConfigCache); mBinding.reset.setOnClickListener(this::onReset); @@ -122,6 +124,11 @@ public class SettingCustomFragment extends BaseFragment { RefreshEvent.config(); } + private void setRemoveAd(View view) { + Setting.putRemoveAd(!Setting.isRemoveAd()); + mBinding.removeAdText.setText(getSwitch(Setting.isRemoveAd())); + } + private void setLanguage(View view) { new MaterialAlertDialogBuilder(getActivity()).setTitle(R.string.setting_language).setNegativeButton(R.string.dialog_negative, null).setSingleChoiceItems(lang, Setting.getLanguage(), (dialog, which) -> { mBinding.languageText.setText(lang[which]); diff --git a/app/src/mobile/res/layout/fragment_setting_custom.xml b/app/src/mobile/res/layout/fragment_setting_custom.xml index 5c3d90d21..b7cb91fed 100644 --- a/app/src/mobile/res/layout/fragment_setting_custom.xml +++ b/app/src/mobile/res/layout/fragment_setting_custom.xml @@ -206,6 +206,33 @@ + + + + + + + + Date: Sun, 12 May 2024 18:30:48 +0800 Subject: [PATCH 5/5] build.gradle --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 41cccdc65..7c3d22fff 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 21 targetSdk 28 versionCode 233 - versionName "0510" + versionName "0512" javaCompileOptions { annotationProcessorOptions { arguments = ["room.schemaLocation": "$projectDir/schemas".toString()]