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 9c9cbc8a8..f4fce8df2 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 @@ -14,6 +14,7 @@ import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.dialog.ButtonsDialog; import com.fongmi.android.tv.ui.dialog.DisplayDialog; +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; @@ -59,6 +60,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.languageText.setText((ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]); mBinding.parseWebviewText.setText((parseWebview = ResUtil.getStringArray(R.array.select_parse_webview))[Setting.getParseWebView()]); } @@ -79,7 +81,9 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeUI.setOnClickListener(this::setHomeUI); mBinding.homeButtons.setOnClickListener(this::onHomeButtons); mBinding.homeHistory.setOnClickListener(this::setHomeHistory); + mBinding.setLanguage.setOnClickListener(this::setLanguage); mBinding.parseWebview.setOnClickListener(this::setParseWebview); + } private void setQuality(View view) { @@ -174,6 +178,15 @@ public class SettingCustomActivity extends BaseActivity { mBinding.homeHistoryText.setText(getSwitch(Setting.isHomeHistory())); } + private void setLanguage(View view) { + LanguageDialog.create(this).show(); + } + + public void setLanguageText() { + mBinding.languageText.setText((ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]); + } + + private void setParseWebview(View view) { int index = Setting.getParseWebView(); Setting.putParseWebView(index = index == parseWebview.length - 1 ? 0 : ++index); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java index de6620d03..be2a6b64b 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/base/BaseActivity.java @@ -19,6 +19,7 @@ import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.WallConfig; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.LanguageUtil; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Util; @@ -37,6 +38,7 @@ public abstract class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + LanguageUtil.setLanguage(this.getResources(),Setting.getLanguage()); setContentView(getBinding().getRoot()); EventBus.getDefault().register(this); Util.hideSystemUI(this); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/LanguageDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/LanguageDialog.java new file mode 100644 index 000000000..b270df545 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/LanguageDialog.java @@ -0,0 +1,87 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.WindowManager; + +import androidx.appcompat.app.AlertDialog; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.Setting; +import com.fongmi.android.tv.databinding.DialogMenuBinding; +import com.fongmi.android.tv.ui.activity.SettingCustomActivity; +import com.fongmi.android.tv.ui.adapter.MenuAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; +import com.fongmi.android.tv.utils.ResUtil; +import com.fongmi.android.tv.utils.Util; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LanguageDialog implements MenuAdapter.OnClickListener { + private final DialogMenuBinding binding; + private final MenuAdapter adapter; + private final AlertDialog dialog; + + private final Activity activity; + + + public static LanguageDialog create(Activity activity) { + return new LanguageDialog(activity); + } + + public LanguageDialog(Activity activity) { + String[] items = ResUtil.getStringArray(R.array.select_language); + List mItems = new ArrayList<>(Arrays.asList(items)); + this.adapter = new MenuAdapter(this, mItems); + this.activity = activity; + this.binding = DialogMenuBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + } + + public void show() { + initView(); + } + + private int getCount() { + return 1; + } + + private float getWidth() { + return 0.4f + (getCount() - 1) * 0.2f; + } + + private void initView() { + setRecyclerView(); + setDialog(); + } + + private void setRecyclerView() { + binding.recycler.setAdapter(adapter); + binding.recycler.setHasFixedSize(true); + binding.recycler.setItemAnimator(null); + binding.recycler.addItemDecoration(new SpaceItemDecoration(getCount(), 16)); + binding.recycler.setLayoutManager(new GridLayoutManager(dialog.getContext(), getCount())); + binding.recycler.post(() -> binding.recycler.scrollToPosition(Setting.getLanguage())); + + } + + private void setDialog() { + WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); + params.width = (int) (ResUtil.getScreenWidth() * getWidth()); + dialog.getWindow().setAttributes(params); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + @Override + public void onItemClick(int position) { + if (dialog != null) dialog.dismiss(); + Setting.putLanguage(position); + ((SettingCustomActivity) activity).setLanguageText(); + Util.restartApp(activity); + } +} diff --git a/app/src/leanback/res/layout/activity_setting_custom.xml b/app/src/leanback/res/layout/activity_setting_custom.xml index 842689396..acee8fe49 100644 --- a/app/src/leanback/res/layout/activity_setting_custom.xml +++ b/app/src/leanback/res/layout/activity_setting_custom.xml @@ -475,6 +475,7 @@ android:id="@+id/parseWebview" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginEnd="16dp" android:layout_weight="1" android:background="@drawable/selector_item" android:focusable="true" @@ -500,6 +501,34 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/App.java b/app/src/main/java/com/fongmi/android/tv/App.java index 0e96213f1..1806ae83c 100644 --- a/app/src/main/java/com/fongmi/android/tv/App.java +++ b/app/src/main/java/com/fongmi/android/tv/App.java @@ -14,6 +14,7 @@ import androidx.core.os.HandlerCompat; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.ui.activity.CrashActivity; +import com.fongmi.android.tv.utils.LanguageUtil; import com.fongmi.android.tv.utils.Notify; import com.github.catvod.Init; import com.github.catvod.bean.Doh; @@ -84,6 +85,7 @@ public class App extends Application { private void setActivity(Activity activity) { this.activity = activity; + LanguageUtil.setLanguage(getResources(),Setting.getLanguage()); } private LogAdapter getLogAdapter() { @@ -144,6 +146,7 @@ public class App extends Application { public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) { } }); + } @Override 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 dde4e9371..def02a36e 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -5,8 +5,11 @@ import android.content.Intent; import android.provider.Settings; 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() { @@ -477,6 +480,14 @@ public class Setting { return Math.min(Prefers.getInt("config_cache", 0), 2); } + public static void putLanguage(int key) { + Prefers.put("language", key); + } + + public static int getLanguage() { + return Prefers.getInt("language", LanguageUtil.locale()); + } + public static void putParseWebView(int key) { Prefers.put("parse_webview", key); } @@ -484,4 +495,6 @@ public class Setting { public static int getParseWebView() { return Prefers.getInt("parse_webview", 0); } + + } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/LanguageUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/LanguageUtil.java new file mode 100644 index 000000000..7a7b84256 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/utils/LanguageUtil.java @@ -0,0 +1,34 @@ +package com.fongmi.android.tv.utils; + +import android.app.Activity; +import android.content.Intent; +import android.content.res.Resources; + +import java.util.Locale; + +public class LanguageUtil { + public static void setLanguage(Resources resources, int lang) { + resources.getConfiguration().locale = getLocale(lang); + resources.updateConfiguration(resources.getConfiguration(), resources.getDisplayMetrics()); + } + + public static int locale() { + if (Locale.getDefault().getLanguage().equals("zh")) { + if (Locale.getDefault().getCountry().equals("TW")) { + return 2; + } else { + return 1; + } + } else { + return 0; + } + } + + private static Locale getLocale(int lang) { + if (lang == 0) return Locale.ENGLISH; + else if (lang == 1) return Locale.CHINESE; + else if (lang == 2) return Locale.TRADITIONAL_CHINESE; + else return Locale.ENGLISH; + } + +} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Util.java b/app/src/main/java/com/fongmi/android/tv/utils/Util.java index bb6f81973..cc1073982 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Util.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Util.java @@ -186,4 +186,10 @@ public class Util { return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); } + public static void restartApp(Activity activity) { + Intent intent = activity.getBaseContext().getPackageManager().getLaunchIntentForPackage(activity.getBaseContext().getPackageName()); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + activity.startActivity(intent); + } + } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6bbd1af39..d539c13c9 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -80,6 +80,7 @@ 图片品质 图片尺寸 聚合搜索 + 语言设置 嗅探内核 全屏菜单键 首页菜单键 @@ -259,6 +260,12 @@ 设置页面 + + 英文 + 简体中文 + 繁体中文 + + 系统 X5 WebView diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9ac646637..ac0ad0546 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -80,6 +80,7 @@ 圖片品質 圖片尺寸 聚合搜索 + 語言設置 嗅探內核 全屏選單鍵 首頁選單鍵 @@ -259,6 +260,12 @@ 設置頁面 + + 英文 + 簡體中文 + 繁體中文 + + 系統 X5 WebView diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d16d8c602..327802871 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -80,6 +80,7 @@ Image quality Image size Aggregated search + Lanuage setting Parse webview Fullscreen menu key Home menu key @@ -259,6 +260,12 @@ Setting page + + English + Simplified Chinese + Traditional Chinese + + System X5 WebView diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java index 076bfbd08..76dc12bf4 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/base/BaseActivity.java @@ -19,6 +19,7 @@ import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.WallConfig; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.LanguageUtil; import com.fongmi.android.tv.utils.ResUtil; import org.greenrobot.eventbus.EventBus; @@ -34,6 +35,7 @@ public abstract class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + LanguageUtil.setLanguage(this.getResources(),Setting.getLanguage()); if (transparent()) setTransparent(this); setContentView(getBinding().getRoot()); EventBus.getDefault().register(this); 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 7040f079c..a5bf3012d 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 @@ -14,6 +14,7 @@ import com.fongmi.android.tv.databinding.FragmentSettingCustomBinding; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.ui.base.BaseFragment; import com.fongmi.android.tv.utils.ResUtil; +import com.fongmi.android.tv.utils.Util; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import java.util.Locale; @@ -23,6 +24,8 @@ public class SettingCustomFragment extends BaseFragment { private FragmentSettingCustomBinding mBinding; private String[] size; + private String[] lang; + public static SettingCustomFragment newInstance() { return new SettingCustomFragment(); } @@ -44,6 +47,7 @@ public class SettingCustomFragment extends BaseFragment { mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); mBinding.aggregatedSearchText.setText(getSwitch(Setting.isAggregatedSearch())); mBinding.homeChangeConfigText.setText(getSwitch(Setting.isHomeChangeConfig())); + mBinding.languageText.setText((lang = ResUtil.getStringArray(R.array.select_language))[Setting.getLanguage()]); } @Override @@ -56,6 +60,8 @@ public class SettingCustomFragment extends BaseFragment { mBinding.incognito.setOnClickListener(this::setIncognito); mBinding.aggregatedSearch.setOnClickListener(this::setAggregatedSearch); mBinding.homeChangeConfig.setOnClickListener(this::setHomeChangeConfig); + mBinding.language.setOnClickListener(this::setLanguage); + } private boolean onTitle(View view) { @@ -111,4 +117,13 @@ public class SettingCustomFragment extends BaseFragment { RefreshEvent.config(); } + 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]); + Setting.putLanguage(which); + dialog.dismiss(); + Util.restartApp(getActivity()); + }).show(); + } + } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java index e51111426..751a7f7f8 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java @@ -54,6 +54,7 @@ import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Trans; import com.google.common.net.HttpHeaders; import com.permissionx.guolindev.PermissionX; +import java.security.SecureRandom; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -161,7 +162,7 @@ public class VodFragment extends BaseFragment implements SiteCallback, FilterCal private void updateHot() { App.post(mRunnable, 10 * 1000); if (mHots.isEmpty() || mHots.size() < 10) return; - mBinding.hot.setText(mHots.get(new Random().nextInt(11))); + mBinding.hot.setText(mHots.get(new SecureRandom().nextInt(11))); } private Result handle(Result result) { diff --git a/app/src/mobile/res/layout/fragment_setting_custom.xml b/app/src/mobile/res/layout/fragment_setting_custom.xml index 3470facb9..cfad70e6f 100644 --- a/app/src/mobile/res/layout/fragment_setting_custom.xml +++ b/app/src/mobile/res/layout/fragment_setting_custom.xml @@ -206,6 +206,31 @@ + + + + + + \ No newline at end of file diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java index 9ca20a809..05e8172d6 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Connect.java @@ -1,7 +1,6 @@ package com.fongmi.quickjs.utils; import com.fongmi.quickjs.bean.Req; -import com.github.catvod.net.OkCookieJar; import com.github.catvod.net.OkHttp; import com.github.catvod.utils.Json; import com.github.catvod.utils.Util; @@ -69,6 +68,7 @@ public class Connect { if (req.getData() != null && "json".equals(req.getPostType())) return getJsonBody(req); if (req.getData() != null && "form".equals(req.getPostType())) return getFormBody(req); if (req.getData() != null && "form-data".equals(req.getPostType())) return getFormDataBody(req); + if (req.getData() != null && "raw".equals(req.getPostType())) return getRawBody(req); if (req.getBody() != null && contentType != null) return RequestBody.create(req.getBody(), MediaType.get(contentType)); return RequestBody.create("", null); } @@ -77,6 +77,10 @@ public class Connect { return RequestBody.create(req.getData().toString(), MediaType.get("application/json; charset=utf-8")); } + private static RequestBody getRawBody(Req req) { + return RequestBody.create(req.getData().toString(), MediaType.get("application/json; charset=utf-8")); + } + private static RequestBody getFormBody(Req req) { FormBody.Builder builder = new FormBody.Builder(); Map params = Json.toMap(req.getData()); @@ -92,6 +96,8 @@ public class Connect { return builder.build(); } + + private static void setHeader(QuickJSContext ctx, Response res, JSObject object) { for (Map.Entry> entry : res.headers().toMultimap().entrySet()) { if (entry.getValue().size() == 1) object.setProperty(entry.getKey(), entry.getValue().get(0)); diff --git a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java index 44357c97d..28044e936 100644 --- a/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java +++ b/quickjs/src/main/java/com/fongmi/quickjs/utils/Crypto.java @@ -2,8 +2,6 @@ package com.fongmi.quickjs.utils; import android.util.Base64; -import com.github.catvod.utils.Util; - import java.security.Key; import java.security.KeyFactory; import java.security.PublicKey; @@ -16,6 +14,7 @@ import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import com.github.catvod.utils.Util; public class Crypto {