Support live can switch config

pull/605/head
jhengazuki 5 months ago
parent 55b7ca84be
commit e891c61593
  1. 42
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  2. 10
      app/src/leanback/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java
  3. 12
      app/src/leanback/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java
  4. 10
      app/src/leanback/res/layout/view_control_live.xml
  5. 2
      app/src/main/assets/index.html
  6. 3
      app/src/main/res/values-zh-rCN/strings.xml
  7. 3
      app/src/main/res/values-zh-rTW/strings.xml
  8. 1
      app/src/main/res/values/strings.xml
  9. 34
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  10. 10
      app/src/mobile/java/com/fongmi/android/tv/ui/adapter/ConfigAdapter.java
  11. 24
      app/src/mobile/java/com/fongmi/android/tv/ui/dialog/HistoryDialog.java
  12. 4
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/VodFragment.java
  13. 15
      app/src/mobile/res/layout/view_control_live_action.xml

@ -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

@ -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<ConfigAdapter.ViewHolder
private final OnClickListener listener;
private List<Config> mItems;
private boolean readOnly;
public ConfigAdapter(OnClickListener listener) {
this.listener = listener;
@ -30,9 +32,14 @@ public class ConfigAdapter extends RecyclerView.Adapter<ConfigAdapter.ViewHolder
void onDeleteClick(Config item);
}
public ConfigAdapter readOnly(boolean readOnly) {
this.readOnly = readOnly;
return this;
}
public ConfigAdapter addAll(int type) {
mItems = Config.getAll(type);
mItems.remove(getConfig(type));
if (!readOnly) mItems.remove(getConfig(type));
return this;
}
@ -69,6 +76,7 @@ public class ConfigAdapter extends RecyclerView.Adapter<ConfigAdapter.ViewHolder
Config item = mItems.get(position);
holder.binding.text.setText(item.getDesc());
holder.binding.text.setOnClickListener(v -> listener.onTextClick(item));
holder.binding.delete.setVisibility(readOnly ? View.GONE : View.VISIBLE);
holder.binding.delete.setOnClickListener(v -> listener.onDeleteClick(item));
}

@ -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() {

@ -18,10 +18,16 @@
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/home"
android:id="@+id/config"
style="@style/Control"
android:layout_marginEnd="12dp"
android:nextFocusLeft="@id/change"
android:text="@string/play_config" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/home"
style="@style/Control"
android:layout_marginEnd="12dp"
tools:text="首頁" />
<com.google.android.material.textview.MaterialTextView
@ -103,7 +109,7 @@
<com.google.android.material.textview.MaterialTextView
android:id="@+id/change"
style="@style/Control"
android:nextFocusRight="@id/home"
android:nextFocusRight="@id/config"
android:text="@string/play_change" />
</androidx.appcompat.widget.LinearLayoutCompat>

@ -70,7 +70,7 @@
<div class="weui-cell weui-cell_active weui-cell_vcode weui-cell_wrap">
<div class="weui-cell__bd weui-flex">
<input id="setting_name" class="weui-input weui-cell__control" type="text" value="" placeholder="請輸入名稱" />
<input id="setting_text" class="weui-input weui-cell__control weui-cell__control_flex" type="text" value="" placeholder="請輸入接口/Proxy/User-Agent..." />
<input id="setting_text" class="weui-input weui-cell__control weui-cell__control_flex" type="text" value="" placeholder="請輸入配置/Proxy/User-Agent..." />
</div>
</div>
</div>

@ -40,6 +40,7 @@
<string name="play_decode">硬解</string>
<string name="play_timer">定时</string>
<string name="play_scale">原始</string>
<string name="play_config">配置</string>
<string name="play_change">换源</string>
<string name="play_invert">反转</string>
<string name="play_across">跨类</string>
@ -118,7 +119,7 @@
<string name="dialog_edit">修改</string>
<string name="dialog_positive">确定</string>
<string name="dialog_negative">取消</string>
<string name="dialog_config_hint">请输入接口</string>
<string name="dialog_config_hint">请输入配置</string>
<string name="dialog_config_name">请输入名称…</string>
<string name="dialog_config_url">请输入地址…</string>

@ -40,6 +40,7 @@
<string name="play_decode">硬解</string>
<string name="play_timer">定時</string>
<string name="play_scale">原始</string>
<string name="play_config">配置</string>
<string name="play_change">換源</string>
<string name="play_invert">反轉</string>
<string name="play_across">跨類</string>
@ -118,7 +119,7 @@
<string name="dialog_edit">修改</string>
<string name="dialog_positive">確定</string>
<string name="dialog_negative">取消</string>
<string name="dialog_config_hint">請輸入接口</string>
<string name="dialog_config_hint">請輸入配置</string>
<string name="dialog_config_name">請輸入名稱…</string>
<string name="dialog_config_url">請輸入網址…</string>

@ -40,6 +40,7 @@
<string name="play_decode">Hard</string>
<string name="play_timer">Timer</string>
<string name="play_scale">Default</string>
<string name="play_config">Config</string>
<string name="play_change">Change</string>
<string name="play_invert">Invert</string>
<string name="play_across">Across</string>

@ -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();

@ -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<ConfigAdapter.ViewHolder
private final OnClickListener listener;
private List<Config> mItems;
private boolean readOnly;
public ConfigAdapter(OnClickListener listener) {
this.listener = listener;
@ -30,9 +32,14 @@ public class ConfigAdapter extends RecyclerView.Adapter<ConfigAdapter.ViewHolder
void onDeleteClick(Config item);
}
public ConfigAdapter readOnly(boolean readOnly) {
this.readOnly = readOnly;
return this;
}
public ConfigAdapter addAll(int type) {
mItems = Config.getAll(type);
mItems.remove(getConfig(type));
if (!readOnly) mItems.remove(getConfig(type));
return this;
}
@ -69,6 +76,7 @@ public class ConfigAdapter extends RecyclerView.Adapter<ConfigAdapter.ViewHolder
Config item = mItems.get(position);
holder.binding.text.setText(item.getDesc());
holder.binding.text.setOnClickListener(v -> listener.onTextClick(item));
holder.binding.delete.setVisibility(readOnly ? View.GONE : View.VISIBLE);
holder.binding.delete.setOnClickListener(v -> listener.onDeleteClick(item));
}

@ -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() {

@ -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);
}
});
}

@ -13,6 +13,16 @@
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/config"
style="@style/Control"
android:text="@string/play_config" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/home"
style="@style/Control"
tools:text="首頁" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/player"
style="@style/Control"
@ -36,11 +46,6 @@
style="@style/Control"
android:text="@string/play_scale" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/home"
style="@style/Control"
tools:text="首頁" />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/line"
style="@style/Control"

Loading…
Cancel
Save