From e891c6159330bb438124d12a1e851e1c8e522963 Mon Sep 17 00:00:00 2001 From: jhengazuki Date: Fri, 24 Oct 2025 03:18:38 +0800 Subject: [PATCH] Support live can switch config --- .../android/tv/ui/activity/LiveActivity.java | 42 ++++++++++++++++++- .../android/tv/ui/adapter/ConfigAdapter.java | 10 ++++- .../android/tv/ui/dialog/HistoryDialog.java | 12 ++++-- .../leanback/res/layout/view_control_live.xml | 10 ++++- app/src/main/assets/index.html | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 3 +- app/src/main/res/values-zh-rTW/strings.xml | 3 +- app/src/main/res/values/strings.xml | 1 + .../android/tv/ui/activity/LiveActivity.java | 34 ++++++++++++++- .../android/tv/ui/adapter/ConfigAdapter.java | 10 ++++- .../android/tv/ui/dialog/HistoryDialog.java | 24 +++++++++-- .../android/tv/ui/fragment/VodFragment.java | 4 +- .../res/layout/view_control_live_action.xml | 15 ++++--- 13 files changed, 146 insertions(+), 24 deletions(-) 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 eea0f5ffd..7605dd106 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 @@ -27,6 +27,7 @@ import com.fongmi.android.tv.R; import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.bean.Channel; +import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Epg; import com.fongmi.android.tv.bean.EpgData; import com.fongmi.android.tv.bean.Group; @@ -39,6 +40,7 @@ import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.impl.Callback; +import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.impl.CustomTarget; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.PassCallback; @@ -51,6 +53,7 @@ import com.fongmi.android.tv.service.PlaybackService; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDownLive; import com.fongmi.android.tv.ui.custom.CustomLiveListView; +import com.fongmi.android.tv.ui.dialog.HistoryDialog; import com.fongmi.android.tv.ui.dialog.LiveDialog; import com.fongmi.android.tv.ui.dialog.PassDialog; import com.fongmi.android.tv.ui.dialog.SubtitleDialog; @@ -72,7 +75,7 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; -public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, EpgDataPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, PassCallback, LiveCallback { +public class LiveActivity extends BaseActivity implements GroupPresenter.OnClickListener, ChannelPresenter.OnClickListener, EpgDataPresenter.OnClickListener, CustomKeyDownLive.Listener, CustomLiveListView.Callback, TrackDialog.Listener, PassCallback, ConfigCallback, LiveCallback { private ActivityLiveBinding mBinding; private ArrayObjectAdapter mChannelAdapter; @@ -93,6 +96,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private Runnable mR3; private Runnable mR4; private Clock mClock; + private View mFocus2; private boolean redirect; private String tag; private int count; @@ -165,6 +169,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.control.line.setOnClickListener(view -> onLine()); mBinding.control.scale.setOnClickListener(view -> onScale()); mBinding.control.speed.setOnClickListener(view -> onSpeed()); + mBinding.control.config.setOnClickListener(view -> onConfig()); mBinding.control.action.setOnClickListener(view -> onAction()); mBinding.control.invert.setOnClickListener(view -> onInvert()); mBinding.control.across.setOnClickListener(view -> onAcross()); @@ -381,6 +386,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick return true; } + private void onConfig() { + HistoryDialog.create(this).readOnly().type(1).show(); + } + private void onAction() { checkPlay(); } @@ -677,6 +686,30 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick App.post(() -> SubtitleDialog.create().view(mBinding.exo.getSubtitleView()).full(true).show(this), 200); } + @Override + public void setConfig(Config config) { + Notify.progress(this); + Config current = LiveConfig.get().getConfig(); + LiveConfig.load(config, getCallback(current)); + } + + private Callback getCallback(Config config) { + return new Callback() { + @Override + public void success() { + Notify.dismiss(); + setLive(getHome()); + } + + @Override + public void error(String msg) { + Notify.dismiss(); + Notify.show(msg); + LiveConfig.get().clear().config(config).load(); + } + }; + } + @Override public void setLive(Live item) { if (item.isActivated()) item.getGroups().clear(); @@ -885,9 +918,14 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick this.redirect = redirect; } + private View getFocus2() { + return mFocus2 == null ? mBinding.control.config : mFocus2; + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { if (isVisible(mBinding.control.getRoot())) setR1Callback(); + if (isVisible(mBinding.control.getRoot())) mFocus2 = getCurrentFocus(); if (mKeyDown.hasEvent(event)) mKeyDown.onKeyDown(event); return super.dispatchKeyEvent(event); } @@ -956,7 +994,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick @Override public void onMenu() { - showControl(mBinding.control.home); + showControl(getFocus2()); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java index 7cec20dc6..7d781b2ac 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java @@ -1,6 +1,7 @@ package com.fongmi.android.tv.ui.adapter; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -18,6 +19,7 @@ public class ConfigAdapter extends RecyclerView.Adapter mItems; + private boolean readOnly; public ConfigAdapter(OnClickListener listener) { this.listener = listener; @@ -30,9 +32,14 @@ public class ConfigAdapter extends RecyclerView.Adapter listener.onTextClick(item)); + holder.binding.delete.setVisibility(readOnly ? View.GONE : View.VISIBLE); holder.binding.delete.setOnClickListener(v -> listener.onDeleteClick(item)); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java index 6be3d5b53..09ff6384a 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java @@ -18,8 +18,9 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { private final DialogHistoryBinding binding; private final ConfigCallback callback; - private final ConfigAdapter adapter; private final AlertDialog dialog; + private ConfigAdapter adapter; + private boolean readOnly; private int type; public static HistoryDialog create(Activity activity) { @@ -35,7 +36,11 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { this.callback = (ConfigCallback) activity; this.binding = DialogHistoryBinding.inflate(LayoutInflater.from(activity)); this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); - this.adapter = new ConfigAdapter(this); + } + + public HistoryDialog readOnly() { + this.readOnly = true; + return this; } public void show() { @@ -44,10 +49,11 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { } private void setRecyclerView() { + adapter = new ConfigAdapter(this); binding.recycler.setItemAnimator(null); binding.recycler.setHasFixedSize(false); - binding.recycler.setAdapter(adapter.addAll(type)); binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); + binding.recycler.setAdapter(adapter.readOnly(readOnly).addAll(type)); } private void setDialog() { diff --git a/app/src/leanback/res/layout/view_control_live.xml b/app/src/leanback/res/layout/view_control_live.xml index 88666163d..419d4948a 100644 --- a/app/src/leanback/res/layout/view_control_live.xml +++ b/app/src/leanback/res/layout/view_control_live.xml @@ -18,10 +18,16 @@ android:orientation="horizontal"> + + diff --git a/app/src/main/assets/index.html b/app/src/main/assets/index.html index dc332d77c..bb5266569 100644 --- a/app/src/main/assets/index.html +++ b/app/src/main/assets/index.html @@ -70,7 +70,7 @@
- +
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 1aab203b3..82def6cdb 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -40,6 +40,7 @@ 硬解 定时 原始 + 配置 换源 反转 跨类 @@ -118,7 +119,7 @@ 修改 确定 取消 - 请输入接口… + 请输入配置… 请输入名称… 请输入地址… diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 77f045d4b..57aa03249 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -40,6 +40,7 @@ 硬解 定時 原始 + 配置 換源 反轉 跨類 @@ -118,7 +119,7 @@ 修改 確定 取消 - 請輸入接口… + 請輸入配置… 請輸入名稱… 請輸入網址… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 60647aa91..289e2d7fa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,7 @@ Hard Timer Default + Config Change Invert Across diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index 94eefbdf2..7649799d7 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -28,6 +28,7 @@ import com.fongmi.android.tv.Setting; import com.fongmi.android.tv.api.config.LiveConfig; import com.fongmi.android.tv.bean.CastVideo; import com.fongmi.android.tv.bean.Channel; +import com.fongmi.android.tv.bean.Config; import com.fongmi.android.tv.bean.Epg; import com.fongmi.android.tv.bean.EpgData; import com.fongmi.android.tv.bean.Group; @@ -40,6 +41,7 @@ import com.fongmi.android.tv.event.ErrorEvent; import com.fongmi.android.tv.event.PlayerEvent; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.impl.Callback; +import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.impl.CustomTarget; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.PassCallback; @@ -55,6 +57,7 @@ import com.fongmi.android.tv.ui.adapter.GroupAdapter; import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomKeyDown; import com.fongmi.android.tv.ui.dialog.CastDialog; +import com.fongmi.android.tv.ui.dialog.HistoryDialog; import com.fongmi.android.tv.ui.dialog.InfoDialog; import com.fongmi.android.tv.ui.dialog.LiveDialog; import com.fongmi.android.tv.ui.dialog.PassDialog; @@ -76,7 +79,7 @@ import java.util.Iterator; import java.util.List; import java.util.UUID; -public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, EpgDataAdapter.OnClickListener, CastDialog.Listener, InfoDialog.Listener { +public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener, TrackDialog.Listener, Biometric.Callback, PassCallback, ConfigCallback, LiveCallback, GroupAdapter.OnClickListener, ChannelAdapter.OnClickListener, EpgDataAdapter.OnClickListener, CastDialog.Listener, InfoDialog.Listener { private ActivityLiveBinding mBinding; private ChannelAdapter mChannelAdapter; @@ -177,6 +180,7 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener mBinding.control.action.line.setOnClickListener(view -> onLine()); mBinding.control.action.scale.setOnClickListener(view -> onScale()); mBinding.control.action.speed.setOnClickListener(view -> onSpeed()); + mBinding.control.action.config.setOnClickListener(view -> onConfig()); mBinding.control.action.invert.setOnClickListener(view -> onInvert()); mBinding.control.action.across.setOnClickListener(view -> onAcross()); mBinding.control.action.change.setOnClickListener(view -> onChange()); @@ -388,6 +392,10 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener return true; } + private void onConfig() { + HistoryDialog.create(this).readOnly().type(1).show(); + } + private void onInvert() { setR1Callback(); Setting.putInvert(!Setting.isInvert()); @@ -700,6 +708,30 @@ public class LiveActivity extends BaseActivity implements CustomKeyDown.Listener App.post(() -> SubtitleDialog.create().view(mBinding.exo.getSubtitleView()).full(true).show(this), 200); } + @Override + public void setConfig(Config config) { + Notify.progress(this); + Config current = LiveConfig.get().getConfig(); + LiveConfig.load(config, getCallback(current)); + } + + private Callback getCallback(Config config) { + return new Callback() { + @Override + public void success() { + Notify.dismiss(); + setLive(getHome()); + } + + @Override + public void error(String msg) { + Notify.dismiss(); + Notify.show(msg); + LiveConfig.get().clear().config(config).load(); + } + }; + } + @Override public void setLive(Live item) { if (item.isActivated()) item.getGroups().clear(); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java index 432fd293e..abd2d6f9b 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java @@ -1,6 +1,7 @@ package com.fongmi.android.tv.ui.adapter; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import androidx.annotation.NonNull; @@ -18,6 +19,7 @@ public class ConfigAdapter extends RecyclerView.Adapter mItems; + private boolean readOnly; public ConfigAdapter(OnClickListener listener) { this.listener = listener; @@ -30,9 +32,14 @@ public class ConfigAdapter extends RecyclerView.Adapter listener.onTextClick(item)); + holder.binding.delete.setVisibility(readOnly ? View.GONE : View.VISIBLE); holder.binding.delete.setOnClickListener(v -> listener.onDeleteClick(item)); } diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java index e967ea7a9..64fbe488a 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java @@ -1,5 +1,6 @@ package com.fongmi.android.tv.ui.dialog; +import android.app.Activity; import android.view.LayoutInflater; import androidx.appcompat.app.AlertDialog; @@ -16,10 +17,15 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { private final DialogHistoryBinding binding; private final ConfigCallback callback; - private final ConfigAdapter adapter; private final AlertDialog dialog; + private ConfigAdapter adapter; + private boolean readOnly; private int type; + public static HistoryDialog create(Activity activity) { + return new HistoryDialog(activity); + } + public static HistoryDialog create(Fragment fragment) { return new HistoryDialog(fragment); } @@ -29,11 +35,21 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { return this; } + public HistoryDialog(Activity activity) { + this.callback = (ConfigCallback) activity; + this.binding = DialogHistoryBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + } + public HistoryDialog(Fragment fragment) { this.callback = (ConfigCallback) fragment; this.binding = DialogHistoryBinding.inflate(LayoutInflater.from(fragment.getContext())); this.dialog = new MaterialAlertDialogBuilder(fragment.requireActivity()).setView(binding.getRoot()).create(); - this.adapter = new ConfigAdapter(this); + } + + public HistoryDialog readOnly() { + this.readOnly = true; + return this; } public void show() { @@ -42,11 +58,11 @@ public class HistoryDialog implements ConfigAdapter.OnClickListener { } private void setRecyclerView() { + adapter = new ConfigAdapter(this); binding.recycler.setItemAnimator(null); binding.recycler.setHasFixedSize(false); - binding.recycler.setAdapter(adapter.addAll(type)); binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 8)); - binding.recycler.post(() -> binding.recycler.scrollToPosition(0)); + binding.recycler.setAdapter(adapter.readOnly(readOnly).addAll(type)); } private void setDialog() { 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 61dc97641..6564772c3 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 @@ -174,7 +174,7 @@ public class VodFragment extends BaseFragment implements ConfigCallback, SiteCal } private void onLogo(View view) { - HistoryDialog.create(this).type(0).show(); + HistoryDialog.create(this).readOnly().type(0).show(); } private void onSite(View view) { @@ -261,8 +261,8 @@ public class VodFragment extends BaseFragment implements ConfigCallback, SiteCal @Override public void error(String msg) { - Notify.show(msg); Notify.dismiss(); + Notify.show(msg); } }); } diff --git a/app/src/mobile/res/layout/view_control_live_action.xml b/app/src/mobile/res/layout/view_control_live_action.xml index b5e653a4a..f838e2046 100644 --- a/app/src/mobile/res/layout/view_control_live_action.xml +++ b/app/src/mobile/res/layout/view_control_live_action.xml @@ -13,6 +13,16 @@ android:layout_height="wrap_content" android:orientation="horizontal"> + + + + - -