From 6551904abd807bebf4e86c695f258fa5788cd965 Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 21 Jul 2023 23:58:44 +0800 Subject: [PATCH] [leanback] support set subtitle size --- .../tv/ui/activity/DetailActivity.java | 18 ++++-- .../android/tv/ui/activity/LiveActivity.java | 15 +++++ .../tv/ui/activity/SettingPlayerActivity.java | 21 ++++++- .../tv/ui/adapter/SubtitleAdapter.java | 60 ++++++++++++++++++ .../tv/ui/custom/dialog/SubtitleDialog.java | 61 +++++++++++++++++++ .../res/layout/activity_setting_player.xml | 29 +++++++++ app/src/leanback/res/layout/adapter_doh.xml | 28 ++++----- .../leanback/res/layout/adapter_subtitle.xml | 14 +++++ .../leanback/res/layout/dialog_subtitle.xml | 9 +++ .../android/tv/impl/SubtitleCallback.java | 6 ++ .../com/fongmi/android/tv/utils/Prefers.java | 8 +++ app/src/main/res/values-zh-rCN/strings.xml | 16 ++++- app/src/main/res/values-zh-rTW/strings.xml | 16 ++++- app/src/main/res/values/strings.xml | 16 ++++- .../tv/ui/fragment/SettingPlayerFragment.java | 2 +- 15 files changed, 290 insertions(+), 29 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SubtitleAdapter.java create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SubtitleDialog.java create mode 100644 app/src/leanback/res/layout/adapter_subtitle.xml create mode 100644 app/src/leanback/res/layout/dialog_subtitle.xml create mode 100644 app/src/main/java/com/fongmi/android/tv/impl/SubtitleCallback.java diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 0928b1c77..081a97998 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -342,9 +342,19 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void setVideoView() { mPlayers.set(getExo(), getIjk()); - getExo().getSubtitleView().setUserDefaultTextSize(); - getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle()); - getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); + setSubtitleView(); + } + + private void setSubtitleView() { + if (Prefers.getSubtitle() == 0) { + getExo().getSubtitleView().setUserDefaultTextSize(); + getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle()); + getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + } else { + getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle()); + getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 14 + Prefers.getSubtitle() * 2); + getExo().getSubtitleView().setFixedTextSize(TypedValue.COMPLEX_UNIT_SP, 14 + Prefers.getSubtitle() * 2); + } } private void setScale(int scale) { @@ -530,7 +540,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void enterFullscreen() { mBinding.video.setForeground(null); - getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 24); mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); mBinding.flag.setSelectedPosition(getCurrentFlag()); mKeyDown.setFull(true); @@ -540,7 +549,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void exitFullscreen() { mBinding.video.setForeground(ResUtil.getDrawable(R.drawable.selector_video)); - getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); mBinding.video.setLayoutParams(mFrameParams); mKeyDown.setFull(false); setFullscreen(false); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 4ff949c8f..ddc3b3a4f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -3,6 +3,7 @@ package com.fongmi.android.tv.ui.activity; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; +import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; @@ -35,6 +36,7 @@ import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.PassCallback; import com.fongmi.android.tv.model.LiveViewModel; +import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.player.source.Source; import com.fongmi.android.tv.ui.base.BaseActivity; @@ -197,6 +199,19 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.control.across.setActivated(Prefers.isAcross()); mBinding.control.change.setActivated(Prefers.isChange()); mBinding.control.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE); + setSubtitleView(); + } + + private void setSubtitleView() { + if (Prefers.getSubtitle() == 0) { + getExo().getSubtitleView().setUserDefaultTextSize(); + getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle()); + getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); + } else { + getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle()); + getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 14 + Prefers.getSubtitle() * 2); + getExo().getSubtitleView().setFixedTextSize(TypedValue.COMPLEX_UNIT_SP, 14 + Prefers.getSubtitle() * 2); + } } private void setScale(int scale) { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java index b0b4f3a6c..d6ab1d01f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingPlayerActivity.java @@ -8,17 +8,20 @@ import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.R; import com.fongmi.android.tv.databinding.ActivitySettingPlayerBinding; +import com.fongmi.android.tv.impl.SubtitleCallback; import com.fongmi.android.tv.impl.UaCallback; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.base.BaseActivity; +import com.fongmi.android.tv.ui.custom.dialog.SubtitleDialog; import com.fongmi.android.tv.ui.custom.dialog.UaDialog; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; -public class SettingPlayerActivity extends BaseActivity implements UaCallback { +public class SettingPlayerActivity extends BaseActivity implements UaCallback, SubtitleCallback { private ActivitySettingPlayerBinding mBinding; + private String[] subtitle; private String[] http; public static void start(Activity activity) { @@ -38,9 +41,10 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback { protected void initView() { mBinding.uaText.setText(Prefers.getUa()); mBinding.tunnelText.setText(getSwitch(Prefers.isTunnel())); - mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_player_http))[Prefers.getHttp()]); - mBinding.tunnel.setVisibility(Players.isExo(Prefers.getPlayer()) ? View.VISIBLE : View.GONE); mBinding.http.setVisibility(Players.isExo(Prefers.getPlayer()) ? View.VISIBLE : View.GONE); + mBinding.tunnel.setVisibility(Players.isExo(Prefers.getPlayer()) ? View.VISIBLE : View.GONE); + mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Prefers.getHttp()]); + mBinding.subtitleText.setText((subtitle = ResUtil.getStringArray(R.array.select_subtitle))[Prefers.getSubtitle()]); } @Override @@ -48,12 +52,17 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback { mBinding.ua.setOnClickListener(this::onUa); mBinding.http.setOnClickListener(this::setHttp); mBinding.tunnel.setOnClickListener(this::setTunnel); + mBinding.subtitle.setOnClickListener(this::onSubtitle); } private void onUa(View view) { UaDialog.create(this).show(); } + private void onSubtitle(View view) { + SubtitleDialog.create(this).show(); + } + private void setHttp(View view) { int index = Prefers.getHttp(); Prefers.putHttp(index = index == http.length - 1 ? 0 : ++index); @@ -71,4 +80,10 @@ public class SettingPlayerActivity extends BaseActivity implements UaCallback { mBinding.uaText.setText(ua); Prefers.putUa(ua); } + + @Override + public void setSubtitle(int position) { + mBinding.subtitleText.setText(subtitle[position]); + Prefers.putSubtitle(position); + } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SubtitleAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SubtitleAdapter.java new file mode 100644 index 000000000..8fd5184bb --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/SubtitleAdapter.java @@ -0,0 +1,60 @@ +package com.fongmi.android.tv.ui.adapter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.R; +import com.fongmi.android.tv.databinding.AdapterSubtitleBinding; +import com.fongmi.android.tv.utils.Prefers; +import com.fongmi.android.tv.utils.ResUtil; + +import java.util.Arrays; +import java.util.List; + +public class SubtitleAdapter extends RecyclerView.Adapter { + + private final OnClickListener mListener; + private final List mItems; + + public SubtitleAdapter(OnClickListener listener) { + this.mItems = Arrays.asList(ResUtil.getStringArray(R.array.select_subtitle)); + this.mListener = listener; + } + + public interface OnClickListener { + + void onItemClick(int position); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterSubtitleBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + String item = mItems.get(position); + holder.binding.text.setText(item); + holder.binding.text.setActivated(Prefers.getSubtitle() == position); + holder.binding.text.setOnClickListener(v -> mListener.onItemClick(position)); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterSubtitleBinding binding; + + public ViewHolder(@NonNull AdapterSubtitleBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SubtitleDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SubtitleDialog.java new file mode 100644 index 000000000..7efea6986 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/SubtitleDialog.java @@ -0,0 +1,61 @@ +package com.fongmi.android.tv.ui.custom.dialog; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.WindowManager; + +import androidx.appcompat.app.AlertDialog; + +import com.fongmi.android.tv.databinding.DialogSubtitleBinding; +import com.fongmi.android.tv.impl.SubtitleCallback; +import com.fongmi.android.tv.ui.adapter.SubtitleAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; +import com.fongmi.android.tv.utils.Prefers; +import com.fongmi.android.tv.utils.ResUtil; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public class SubtitleDialog implements SubtitleAdapter.OnClickListener { + + private final DialogSubtitleBinding binding; + private final SubtitleCallback callback; + private final SubtitleAdapter adapter; + private final AlertDialog dialog; + + public static SubtitleDialog create(Activity activity) { + return new SubtitleDialog(activity); + } + + public SubtitleDialog(Activity activity) { + this.callback = (SubtitleCallback) activity; + this.binding = DialogSubtitleBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + this.adapter = new SubtitleAdapter(this); + } + + public void show() { + setRecyclerView(); + setDialog(); + } + + private void setRecyclerView() { + binding.recycler.setAdapter(adapter); + binding.recycler.setHasFixedSize(true); + binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); + binding.recycler.scrollToPosition(Prefers.getSubtitle()); + } + + private void setDialog() { + if (adapter.getItemCount() == 0) return; + WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); + params.width = (int) (ResUtil.getScreenWidth() * 0.4f); + dialog.getWindow().setAttributes(params); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + @Override + public void onItemClick(int position) { + callback.setSubtitle(position); + dialog.dismiss(); + } +} diff --git a/app/src/leanback/res/layout/activity_setting_player.xml b/app/src/leanback/res/layout/activity_setting_player.xml index 2b04e94ce..98d075c0d 100644 --- a/app/src/leanback/res/layout/activity_setting_player.xml +++ b/app/src/leanback/res/layout/activity_setting_player.xml @@ -102,5 +102,34 @@ tools:text="關" /> + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_doh.xml b/app/src/leanback/res/layout/adapter_doh.xml index fbc7c2ab7..35faeb7a5 100644 --- a/app/src/leanback/res/layout/adapter_doh.xml +++ b/app/src/leanback/res/layout/adapter_doh.xml @@ -1,20 +1,14 @@ - - - - - \ No newline at end of file + android:layout_height="40dp" + android:background="@drawable/selector_text" + android:focusable="true" + android:focusableInTouchMode="true" + android:gravity="center" + android:singleLine="true" + android:textColor="@color/text" + android:textSize="18sp" + tools:text="Google" /> \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_subtitle.xml b/app/src/leanback/res/layout/adapter_subtitle.xml new file mode 100644 index 000000000..273397eae --- /dev/null +++ b/app/src/leanback/res/layout/adapter_subtitle.xml @@ -0,0 +1,14 @@ + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/dialog_subtitle.xml b/app/src/leanback/res/layout/dialog_subtitle.xml new file mode 100644 index 000000000..29632553f --- /dev/null +++ b/app/src/leanback/res/layout/dialog_subtitle.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/impl/SubtitleCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/SubtitleCallback.java new file mode 100644 index 000000000..97d796bc0 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/SubtitleCallback.java @@ -0,0 +1,6 @@ +package com.fongmi.android.tv.impl; + +public interface SubtitleCallback { + + void setSubtitle(int position); +} diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java index 044c7ff5a..306839ffc 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java @@ -220,6 +220,14 @@ public class Prefers { put("ua", ua); } + public static int getSubtitle() { + return getInt("subtitle"); + } + + public static void putSubtitle(int subtitle) { + put("subtitle", subtitle); + } + public static boolean isTunnel() { return getBoolean("exo_tunnel"); } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 922c26afb..07897434b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -68,6 +68,7 @@ User-Agent 连线方式 隧道模式 + 字幕大小 解码方式 渲染方式 缩放比例 @@ -135,7 +136,7 @@ EXO - + 预设 OkHttp @@ -166,4 +167,17 @@ 重播 + + 默认 + 14sp + 16sp + 18sp + 20sp + 22sp + 24sp + 26sp + 28sp + 30sp + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e7ced1632..6f4d5f888 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -68,6 +68,7 @@ User-Agent 連線方式 隧道模式 + 字幕大小 解碼方式 渲染方式 縮放比例 @@ -135,7 +136,7 @@ EXO - + 預設 OkHttp @@ -166,4 +167,17 @@ 重播 + + 預設 + 14sp + 16sp + 18sp + 20sp + 22sp + 24sp + 26sp + 28sp + 30sp + + \ 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 8dbe3243f..daa36b986 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -68,6 +68,7 @@ User-Agent HTTP method Tunnel mode + Subtitle size Decode Render Scale @@ -135,7 +136,7 @@ EXO - + Default OkHttp @@ -171,4 +172,17 @@ Replay + + Default + 14sp + 16sp + 18sp + 20sp + 22sp + 24sp + 26sp + 28sp + 30sp + + \ No newline at end of file diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java index 12eeab74d..39906a5f3 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingPlayerFragment.java @@ -40,7 +40,7 @@ public class SettingPlayerFragment extends BaseFragment implements UaCallback { protected void initView() { mBinding.uaText.setText(Prefers.getUa()); mBinding.tunnelText.setText(getSwitch(Prefers.isTunnel())); - mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_player_http))[Prefers.getHttp()]); + mBinding.httpText.setText((http = ResUtil.getStringArray(R.array.select_exo_http))[Prefers.getHttp()]); setVisible(); }