From 1ae38f0b1e8ba7238913d237780f3ab798f1ce55 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 1 Dec 2022 20:40:59 +0800 Subject: [PATCH 01/26] Fix episode bug --- .../java/com/fongmi/android/tv/ui/activity/DetailActivity.java | 1 + 1 file changed, 1 insertion(+) 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 232576ed5..afaa90628 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 @@ -343,6 +343,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void reverseEpisode() { for (int i = 0; i < mFlagAdapter.size(); i++) Collections.reverse(((Vod.Flag) mFlagAdapter.get(i)).getEpisodes()); mEpisodeAdapter.setItems(getVodFlag().getEpisodes(), null); + mBinding.episode.setSelectedPosition(getEpisodePosition()); setArray(mEpisodeAdapter.size()); } From 7a3d38224d6259b46617e36159f371feffa4f1f8 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 1 Dec 2022 21:41:40 +0800 Subject: [PATCH 02/26] Update dialog_config.xml --- app/src/leanback/res/layout/dialog_config.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/leanback/res/layout/dialog_config.xml b/app/src/leanback/res/layout/dialog_config.xml index 79fff57d6..774a0ed70 100644 --- a/app/src/leanback/res/layout/dialog_config.xml +++ b/app/src/leanback/res/layout/dialog_config.xml @@ -17,6 +17,7 @@ android:layout_height="wrap_content" android:layout_marginStart="12dp" android:layout_toEndOf="@+id/code" + android:focusable="true" android:lineSpacingExtra="4dp" android:paddingStart="4dp" android:paddingEnd="4dp" From 943ec03e16a699760ba5427e80a3c4c0829e4ee1 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 1 Dec 2022 23:55:22 +0800 Subject: [PATCH 03/26] Support quick search - part 1 --- .../tv/ui/activity/DetailActivity.java | 49 +++++++++++++- .../tv/ui/presenter/SuggestPresenter.java | 64 +++++++++++++++++++ .../leanback/res/layout/activity_detail.xml | 17 ++++- .../leanback/res/layout/adapter_suggest.xml | 42 ++++++++++++ 4 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java create mode 100644 app/src/leanback/res/layout/adapter_suggest.xml 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 afaa90628..35494e224 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 @@ -45,6 +45,7 @@ import com.fongmi.android.tv.ui.presenter.EpisodePresenter; import com.fongmi.android.tv.ui.presenter.FlagPresenter; import com.fongmi.android.tv.ui.presenter.ParsePresenter; import com.fongmi.android.tv.ui.presenter.PartPresenter; +import com.fongmi.android.tv.ui.presenter.SuggestPresenter; import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; @@ -60,7 +61,10 @@ import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import okhttp3.Call; import okhttp3.Response; @@ -75,9 +79,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private ArrayObjectAdapter mEpisodeAdapter; private ArrayObjectAdapter mParseAdapter; private ArrayObjectAdapter mPartAdapter; + private ArrayObjectAdapter mSuggestAdapter; private EpisodePresenter mEpisodePresenter; private PartPresenter mPartPresenter; private CustomKeyDownVod mKeyDown; + private ExecutorService mExecutor; private SiteViewModel mViewModel; private boolean mFullscreen; private History mHistory; @@ -211,7 +217,15 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.array.setAdapter(new ItemBridgeAdapter(mArrayAdapter = new ArrayObjectAdapter(new ArrayPresenter(this)))); mBinding.part.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.part.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(item -> CollectActivity.start(this, item))))); + mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(this::initSearch)))); + mBinding.suggest.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.suggest.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.suggest.setAdapter(new ItemBridgeAdapter(mSuggestAdapter = new ArrayObjectAdapter(new SuggestPresenter(new SuggestPresenter.OnClickListener() { + @Override + public void onItemClick(Vod item) { + + } + })))); mBinding.control.parse.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.control.parse.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mBinding.control.parse.setAdapter(new ItemBridgeAdapter(mParseAdapter = new ArrayObjectAdapter(new ParsePresenter(this::setParseActivated)))); @@ -251,7 +265,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis resetFocus(useParse); }); mViewModel.result.observe(this, result -> { - if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty(); + if (mExecutor != null) setSuggest(result.getList()); + else if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty(); else setDetail(result.getList().get(0)); }); } @@ -368,6 +383,36 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mArrayAdapter.setItems(items, null); } + private void stopSearch() { + if (mExecutor != null) mExecutor.shutdownNow(); + } + + private void initSearch(String keyword) { + stopSearch(); + startSearch(keyword); + mBinding.part.setTag(keyword); + } + + private void startSearch(String keyword) { + mExecutor = Executors.newFixedThreadPool(5); + for (Site site : ApiConfig.get().getSites()) if (site.isSearchable() && !site.getKey().equals(getKey())) mExecutor.execute(() -> search(site, keyword)); + } + + private void search(Site site, String keyword) { + try { + mViewModel.searchContent(site, keyword); + } catch (Throwable ignored) { + } + } + + private void setSuggest(List items) { + String keyword = mBinding.part.getTag().toString(); + Iterator iterator = items.iterator(); + while (iterator.hasNext()) if (!iterator.next().getVodName().equals(keyword)) iterator.remove(); + mSuggestAdapter.addAll(mSuggestAdapter.size(), items); + mBinding.suggest.setVisibility(View.VISIBLE); + } + @Override public void onRevSort() { mHistory.setRevSort(!mHistory.isRevSort()); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java new file mode 100644 index 000000000..9ec560eaa --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java @@ -0,0 +1,64 @@ +package com.fongmi.android.tv.ui.presenter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.leanback.widget.Presenter; + +import com.fongmi.android.tv.bean.Vod; +import com.fongmi.android.tv.databinding.AdapterSuggestBinding; +import com.fongmi.android.tv.utils.ResUtil; + +public class SuggestPresenter extends Presenter { + + private final OnClickListener mListener; + private int width; + + public SuggestPresenter(OnClickListener listener) { + this.mListener = listener; + setLayoutSize(); + } + + private void setLayoutSize() { + int space = ResUtil.dp2px(24) + ResUtil.dp2px(8 * 5); + int base = ResUtil.getScreenWidthPx() - space; + width = base / 5; + } + + public interface OnClickListener { + + void onItemClick(Vod item); + } + + @Override + public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { + ViewHolder holder = new ViewHolder(AdapterSuggestBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + holder.binding.getRoot().getLayoutParams().width = width; + return holder; + } + + @Override + public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object object) { + Vod item = (Vod) object; + ViewHolder holder = (ViewHolder) viewHolder; + holder.binding.name.setText(item.getVodName()); + holder.binding.site.setText(item.getSiteName()); + holder.binding.remark.setText(item.getVodRemarks()); + setOnClickListener(holder, view -> mListener.onItemClick(item)); + } + + @Override + public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) { + } + + public static class ViewHolder extends Presenter.ViewHolder { + + private final AdapterSuggestBinding binding; + + public ViewHolder(@NonNull AdapterSuggestBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_detail.xml b/app/src/leanback/res/layout/activity_detail.xml index 5bc2656d3..f026a10b6 100644 --- a/app/src/leanback/res/layout/activity_detail.xml +++ b/app/src/leanback/res/layout/activity_detail.xml @@ -218,7 +218,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/video" - android:layout_marginTop="12dp"> + android:layout_marginTop="12dp" + android:overScrollMode="never"> + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_suggest.xml b/app/src/leanback/res/layout/adapter_suggest.xml new file mode 100644 index 000000000..b5c8a3edf --- /dev/null +++ b/app/src/leanback/res/layout/adapter_suggest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + \ No newline at end of file From 8ce116381272285e3c3dd3e34ee2d864d442567f Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 2 Dec 2022 09:20:12 +0800 Subject: [PATCH 04/26] Update IjkVideoView.java --- .../main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index 1a39f0913..f164a6157 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -6,6 +6,7 @@ import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; +import android.os.Process; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; @@ -507,7 +508,7 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl mIjkPlayer.setOption(format, "http-detect-range-support", 0); mIjkPlayer.setOption(player, "enable-accurate-seek", 0); mIjkPlayer.setOption(player, "framedrop", 1); - mIjkPlayer.setOption(player, "max-buffer-size", 5242880); + mIjkPlayer.setOption(player, "max-buffer-size", 15 * 1024 * 1024); mIjkPlayer.setOption(player, "mediacodec", mCurrentDecode); mIjkPlayer.setOption(player, "mediacodec-auto-rotate", mCurrentDecode); mIjkPlayer.setOption(player, "mediacodec-handle-resolution-change", mCurrentDecode); From 992bfb1b6af254269e9dc5b6a4e110e7e03e3ddd Mon Sep 17 00:00:00 2001 From: FongMi Date: Fri, 2 Dec 2022 09:20:21 +0800 Subject: [PATCH 05/26] Update IjkVideoView.java --- .../main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java index f164a6157..ab0317df9 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.java @@ -6,7 +6,6 @@ import android.media.AudioManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; -import android.os.Process; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; From fc5a7f732a7b813f2b587d657b25462462af0b2c Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 03:01:20 +0800 Subject: [PATCH 06/26] MediaItem support decode --- .../com/fongmi/android/tv/player/ExoUtil.java | 6 ++++-- .../com/fongmi/android/tv/player/Players.java | 2 +- .../danmaku/ijk/media/player/IjkMediaPlayer.java | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 4 deletions(-) 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 83d3a3ca9..799cd0d5c 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 @@ -7,6 +7,7 @@ import android.text.TextUtils; import com.fongmi.android.tv.App; import com.fongmi.android.tv.bean.Result; import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.Prefers; import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.PlaybackException; @@ -50,8 +51,8 @@ public class ExoUtil { return trackSelector; } - public static RenderersFactory buildRenderersFactory(int decode) { - return new DefaultRenderersFactory(App.get()).setExtensionRendererMode(Math.abs(decode - 2)); + public static RenderersFactory buildRenderersFactory() { + return new DefaultRenderersFactory(App.get()).setExtensionRendererMode(Math.abs(Prefers.getDecode() - 2)); } public static CaptionStyleCompat getCaptionStyle() { @@ -75,6 +76,7 @@ public class ExoUtil { if (errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED) builder.setMimeType(MimeTypes.APPLICATION_OCTET); else if (errorCode == PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED) builder.setMimeType(MimeTypes.APPLICATION_M3U8); if (!TextUtils.isEmpty(sub)) builder.setSubtitleConfigurations(getSubtitles(sub)); + builder.setDecode(Prefers.getDecode()); return builder.build(); } diff --git a/app/src/main/java/com/fongmi/android/tv/player/Players.java b/app/src/main/java/com/fongmi/android/tv/player/Players.java index c1b99c5ab..083648247 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/Players.java +++ b/app/src/main/java/com/fongmi/android/tv/player/Players.java @@ -65,7 +65,7 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM public void setupExo(StyledPlayerView view) { if (exoPlayer != null) releaseExo(); - exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(ExoUtil.buildRenderersFactory(decode)).setTrackSelector(ExoUtil.buildTrackSelector()).build(); + exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(ExoUtil.buildRenderersFactory()).setTrackSelector(ExoUtil.buildTrackSelector()).build(); exoPlayer.addAnalyticsListener(this); exoPlayer.setPlayWhenReady(true); exoPlayer.addListener(this); diff --git a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java index f97690f82..791f55b09 100644 --- a/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java +++ b/ijkplayer/src/main/java/tv/danmaku/ijk/media/player/IjkMediaPlayer.java @@ -45,12 +45,16 @@ import android.view.SurfaceHolder; import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.lang.ref.WeakReference; import java.lang.reflect.Field; +import java.net.URLEncoder; import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Locale; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import tv.danmaku.ijk.media.player.annotations.AccessedByNative; import tv.danmaku.ijk.media.player.annotations.CalledByNative; @@ -372,7 +376,16 @@ public final class IjkMediaPlayer extends AbstractMediaPlayer { } } - setDataSource(uri.toString(), headers); + setDataSource(encodeSpaceChinese(uri.toString()), headers); + } + + private String encodeSpaceChinese(String str) throws UnsupportedEncodingException { + Pattern p = Pattern.compile("[\u4e00-\u9fa5 ]+"); + Matcher m = p.matcher(str); + StringBuffer b = new StringBuffer(); + while (m.find()) m.appendReplacement(b, URLEncoder.encode(m.group(0), "UTF-8")); + m.appendTail(b); + return b.toString(); } /** From 24cda8aee21478f83398fb50a54fdedff8fcb2cb Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 13:27:44 +0800 Subject: [PATCH 07/26] Update Config.java --- app/src/main/java/com/fongmi/android/tv/bean/Config.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Config.java b/app/src/main/java/com/fongmi/android/tv/bean/Config.java index 7d3da0293..cefc05ec4 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Config.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Config.java @@ -27,7 +27,6 @@ public class Config { public Config(String url, int type) { this.url = url; this.type = type; - this.time = System.currentTimeMillis(); this.id = (int) insert(); } From a113cfa960eb88faf997611fee5761584ee7ea0f Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 15:24:57 +0800 Subject: [PATCH 08/26] Support quick search - part 2 --- .../tv/ui/activity/CollectActivity.java | 2 +- .../tv/ui/activity/DetailActivity.java | 30 +++++++++++-------- ...estPresenter.java => SearchPresenter.java} | 12 ++++---- .../leanback/res/layout/activity_detail.xml | 2 +- ...adapter_suggest.xml => adapter_search.xml} | 0 .../android/tv/model/SiteViewModel.java | 4 ++- 6 files changed, 29 insertions(+), 21 deletions(-) rename app/src/leanback/java/com/fongmi/android/tv/ui/presenter/{SuggestPresenter.java => SearchPresenter.java} (78%) rename app/src/leanback/res/layout/{adapter_suggest.xml => adapter_search.xml} (100%) diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java index e601cb95d..c1c717537 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/CollectActivity.java @@ -97,7 +97,7 @@ public class CollectActivity extends BaseActivity { private void setViewModel() { mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); - mViewModel.result.observe(this, result -> { + mViewModel.search.observe(this, result -> { mAdapter.add(Collect.create(result.getList())); getFragment().addVideo(result.getList()); mPageAdapter.notifyDataSetChanged(); 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 35494e224..c98b44bd7 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 @@ -45,7 +45,7 @@ import com.fongmi.android.tv.ui.presenter.EpisodePresenter; import com.fongmi.android.tv.ui.presenter.FlagPresenter; import com.fongmi.android.tv.ui.presenter.ParsePresenter; import com.fongmi.android.tv.ui.presenter.PartPresenter; -import com.fongmi.android.tv.ui.presenter.SuggestPresenter; +import com.fongmi.android.tv.ui.presenter.SearchPresenter; import com.fongmi.android.tv.utils.Clock; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; @@ -79,7 +79,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private ArrayObjectAdapter mEpisodeAdapter; private ArrayObjectAdapter mParseAdapter; private ArrayObjectAdapter mPartAdapter; - private ArrayObjectAdapter mSuggestAdapter; + private ArrayObjectAdapter mSearchAdapter; private EpisodePresenter mEpisodePresenter; private PartPresenter mPartPresenter; private CustomKeyDownVod mKeyDown; @@ -218,12 +218,15 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.part.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.part.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(this::initSearch)))); - mBinding.suggest.setHorizontalSpacing(ResUtil.dp2px(8)); - mBinding.suggest.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - mBinding.suggest.setAdapter(new ItemBridgeAdapter(mSuggestAdapter = new ArrayObjectAdapter(new SuggestPresenter(new SuggestPresenter.OnClickListener() { + mBinding.search.setHorizontalSpacing(ResUtil.dp2px(8)); + mBinding.search.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mBinding.search.setAdapter(new ItemBridgeAdapter(mSearchAdapter = new ArrayObjectAdapter(new SearchPresenter(new SearchPresenter.OnClickListener() { @Override public void onItemClick(Vod item) { - + getIntent().putExtra("key", item.getSite().getKey()); + getIntent().putExtra("id", item.getVodId()); + Clock.get().setCallback(null); + getDetail(); } })))); mBinding.control.parse.setHorizontalSpacing(ResUtil.dp2px(8)); @@ -265,10 +268,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis resetFocus(useParse); }); mViewModel.result.observe(this, result -> { - if (mExecutor != null) setSuggest(result.getList()); - else if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty(); + if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty(); else setDetail(result.getList().get(0)); }); + mViewModel.search.observe(this, result -> { + setSearch(result.getList()); + }); } private void resetFocus(boolean useParse) { @@ -385,6 +390,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void stopSearch() { if (mExecutor != null) mExecutor.shutdownNow(); + mSearchAdapter.clear(); } private void initSearch(String keyword) { @@ -405,12 +411,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } } - private void setSuggest(List items) { + private void setSearch(List items) { String keyword = mBinding.part.getTag().toString(); Iterator iterator = items.iterator(); - while (iterator.hasNext()) if (!iterator.next().getVodName().equals(keyword)) iterator.remove(); - mSuggestAdapter.addAll(mSuggestAdapter.size(), items); - mBinding.suggest.setVisibility(View.VISIBLE); + while (iterator.hasNext()) if (!iterator.next().getVodName().contains(keyword)) iterator.remove(); + mSearchAdapter.addAll(mSearchAdapter.size(), items); + mBinding.search.setVisibility(View.VISIBLE); } @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java similarity index 78% rename from app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java index 9ec560eaa..62c9e903f 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SuggestPresenter.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/presenter/SearchPresenter.java @@ -7,15 +7,15 @@ import androidx.annotation.NonNull; import androidx.leanback.widget.Presenter; import com.fongmi.android.tv.bean.Vod; -import com.fongmi.android.tv.databinding.AdapterSuggestBinding; +import com.fongmi.android.tv.databinding.AdapterSearchBinding; import com.fongmi.android.tv.utils.ResUtil; -public class SuggestPresenter extends Presenter { +public class SearchPresenter extends Presenter { private final OnClickListener mListener; private int width; - public SuggestPresenter(OnClickListener listener) { + public SearchPresenter(OnClickListener listener) { this.mListener = listener; setLayoutSize(); } @@ -33,7 +33,7 @@ public class SuggestPresenter extends Presenter { @Override public Presenter.ViewHolder onCreateViewHolder(ViewGroup parent) { - ViewHolder holder = new ViewHolder(AdapterSuggestBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + ViewHolder holder = new ViewHolder(AdapterSearchBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); holder.binding.getRoot().getLayoutParams().width = width; return holder; } @@ -54,9 +54,9 @@ public class SuggestPresenter extends Presenter { public static class ViewHolder extends Presenter.ViewHolder { - private final AdapterSuggestBinding binding; + private final AdapterSearchBinding binding; - public ViewHolder(@NonNull AdapterSuggestBinding binding) { + public ViewHolder(@NonNull AdapterSearchBinding binding) { super(binding.getRoot()); this.binding = binding; } diff --git a/app/src/leanback/res/layout/activity_detail.xml b/app/src/leanback/res/layout/activity_detail.xml index f026a10b6..911cbc14b 100644 --- a/app/src/leanback/res/layout/activity_detail.xml +++ b/app/src/leanback/res/layout/activity_detail.xml @@ -273,7 +273,7 @@ android:paddingBottom="8dp" /> result; public MutableLiveData player; + public MutableLiveData search; public ExecutorService executor; public SiteViewModel() { this.result = new MutableLiveData<>(); this.player = new MutableLiveData<>(); + this.search = new MutableLiveData<>(); } public MutableLiveData getResult() { @@ -179,7 +181,7 @@ public class SiteViewModel extends ViewModel { private void post(Site site, Result result) { if (result.getList().isEmpty()) return; for (Vod vod : result.getList()) vod.setSite(site); - this.result.postValue(result); + this.search.postValue(result); } private void execute(MutableLiveData result, Callable callable) { From ccad460174ee49cb7b4c7badba0ea1b0ffa16e71 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 15:30:41 +0800 Subject: [PATCH 09/26] Support quick search - part 3 --- .../tv/ui/activity/DetailActivity.java | 20 ++++++++++--------- .../leanback/res/layout/activity_detail.xml | 1 + 2 files changed, 12 insertions(+), 9 deletions(-) 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 c98b44bd7..16aa3ed6f 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 @@ -220,15 +220,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.part.setAdapter(new ItemBridgeAdapter(mPartAdapter = new ArrayObjectAdapter(mPartPresenter = new PartPresenter(this::initSearch)))); mBinding.search.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.search.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); - mBinding.search.setAdapter(new ItemBridgeAdapter(mSearchAdapter = new ArrayObjectAdapter(new SearchPresenter(new SearchPresenter.OnClickListener() { - @Override - public void onItemClick(Vod item) { - getIntent().putExtra("key", item.getSite().getKey()); - getIntent().putExtra("id", item.getVodId()); - Clock.get().setCallback(null); - getDetail(); - } - })))); + mBinding.search.setAdapter(new ItemBridgeAdapter(mSearchAdapter = new ArrayObjectAdapter(new SearchPresenter(this::getDetail)))); mBinding.control.parse.setHorizontalSpacing(ResUtil.dp2px(8)); mBinding.control.parse.setRowHeight(ViewGroup.LayoutParams.WRAP_CONTENT); mBinding.control.parse.setAdapter(new ItemBridgeAdapter(mParseAdapter = new ArrayObjectAdapter(new ParsePresenter(this::setParseActivated)))); @@ -270,6 +262,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel.result.observe(this, result -> { if (result.getList().isEmpty()) mBinding.progressLayout.showEmpty(); else setDetail(result.getList().get(0)); + Notify.dismiss(); }); mViewModel.search.observe(this, result -> { setSearch(result.getList()); @@ -287,6 +280,15 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel.detailContent(getKey(), getId()); } + private void getDetail(Vod item) { + getIntent().putExtra("key", item.getSite().getKey()); + getIntent().putExtra("id", item.getVodId()); + mBinding.scroll.scrollTo(0,0); + Clock.get().setCallback(null); + Notify.progress(this); + getDetail(); + } + private void getPlayer(boolean replay) { Vod.Flag.Episode item = (Vod.Flag.Episode) mEpisodeAdapter.get(getEpisodePosition()); if (mFullscreen && mPlayers.getRetry() == 0) Notify.show(ResUtil.getString(R.string.play_ready, item.getName())); diff --git a/app/src/leanback/res/layout/activity_detail.xml b/app/src/leanback/res/layout/activity_detail.xml index 911cbc14b..e97a8dfd6 100644 --- a/app/src/leanback/res/layout/activity_detail.xml +++ b/app/src/leanback/res/layout/activity_detail.xml @@ -215,6 +215,7 @@ Date: Sun, 4 Dec 2022 16:17:33 +0800 Subject: [PATCH 10/26] Support quick search - part 4 --- .../tv/ui/activity/DetailActivity.java | 25 ++++++++++--------- .../leanback/res/layout/activity_detail.xml | 7 +++--- 2 files changed, 16 insertions(+), 16 deletions(-) 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 16aa3ed6f..f952c12c9 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 @@ -329,9 +329,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void setText(TextView view, int resId, String text) { - if (text.isEmpty()) view.setVisibility(View.GONE); - else if (resId > 0) view.setText(ResUtil.getString(resId, text)); - else view.setText(text); + view.setVisibility(text.isEmpty() ? View.GONE : View.VISIBLE); + view.setText(resId > 0 ? ResUtil.getString(resId, text) : text); view.setTag(text); } @@ -341,10 +340,16 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.flag.setSelectedPosition(mFlagAdapter.indexOf(item)); mEpisodeAdapter.setItems(item.getEpisodes(), null); notifyItemChanged(mBinding.flag, mFlagAdapter); - setArray(item.getEpisodes().size()); + setEpisodeAdapter(item.getEpisodes()); seamless(item); } + private void setEpisodeAdapter(List items) { + mBinding.episode.setVisibility(items.isEmpty() ? View.GONE : View.VISIBLE); + mEpisodeAdapter.setItems(items, null); + setArray(items.size()); + } + private void seamless(Vod.Flag flag) { Vod.Flag.Episode episode = flag.find(mHistory.getVodRemarks()); if (episode == null || episode.isActivated()) return; @@ -364,9 +369,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void reverseEpisode() { for (int i = 0; i < mFlagAdapter.size(); i++) Collections.reverse(((Vod.Flag) mFlagAdapter.get(i)).getEpisodes()); - mEpisodeAdapter.setItems(getVodFlag().getEpisodes(), null); + setEpisodeAdapter(getVodFlag().getEpisodes()); mBinding.episode.setSelectedPosition(getEpisodePosition()); - setArray(mEpisodeAdapter.size()); } private void setParseActivated(Parse item) { @@ -641,12 +645,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private boolean hasFlag() { - if (mFlagAdapter.size() > 0) return true; - mBinding.flag.setVisibility(View.GONE); - mBinding.array.setVisibility(View.GONE); - mBinding.episode.setVisibility(View.GONE); - Notify.show(R.string.error_episode); - return false; + mBinding.flag.setVisibility(mFlagAdapter.size() > 0 ? View.VISIBLE : View.GONE); + if (mFlagAdapter.size() == 0) Notify.show(R.string.error_episode); + return mFlagAdapter.size() > 0; } private void checkHistory() { diff --git a/app/src/leanback/res/layout/activity_detail.xml b/app/src/leanback/res/layout/activity_detail.xml index e97a8dfd6..afeb70ef6 100644 --- a/app/src/leanback/res/layout/activity_detail.xml +++ b/app/src/leanback/res/layout/activity_detail.xml @@ -16,7 +16,8 @@ android:background="@color/black" android:focusable="true" android:focusableInTouchMode="true" - android:foreground="@drawable/selector_video"> + android:foreground="@drawable/selector_video" + android:nextFocusDown="@id/flag"> + android:paddingBottom="8dp" /> Date: Sun, 4 Dec 2022 17:08:18 +0800 Subject: [PATCH 11/26] Support quick search - part 5 --- .../android/tv/ui/activity/DetailActivity.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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 f952c12c9..5b2a954ac 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 @@ -283,7 +283,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void getDetail(Vod item) { getIntent().putExtra("key", item.getSite().getKey()); getIntent().putExtra("id", item.getVodId()); - mBinding.scroll.scrollTo(0,0); + mBinding.scroll.scrollTo(0, 0); Clock.get().setCallback(null); Notify.progress(this); getDetail(); @@ -418,13 +418,19 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void setSearch(List items) { - String keyword = mBinding.part.getTag().toString(); Iterator iterator = items.iterator(); - while (iterator.hasNext()) if (!iterator.next().getVodName().contains(keyword)) iterator.remove(); + while (iterator.hasNext()) if (mismatch(iterator.next())) iterator.remove(); mSearchAdapter.addAll(mSearchAdapter.size(), items); mBinding.search.setVisibility(View.VISIBLE); } + private boolean mismatch(Vod item) { + String name = mBinding.name.getText().toString(); + String keyword = mBinding.part.getTag().toString(); + boolean accurate = keyword.equals(name) && isVisible(mBinding.widget.error); + return accurate && !item.getVodName().equals(keyword) || !item.getVodName().contains(keyword); + } + @Override public void onRevSort() { mHistory.setRevSort(!mHistory.isRevSort()); @@ -745,6 +751,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onError(String msg) { int position = mBinding.flag.getSelectedPosition(); if (position == mFlagAdapter.size() - 1) { + initSearch(mBinding.name.getText().toString()); mBinding.widget.text.setText(msg); Clock.get().setCallback(null); mPlayers.stop(); From 534da009c4105599b27f9a53747ad033065d56a0 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 17:19:40 +0800 Subject: [PATCH 12/26] Update ExoUtil.java --- app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 799cd0d5c..1c16dd03f 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 @@ -76,7 +76,7 @@ public class ExoUtil { if (errorCode == PlaybackException.ERROR_CODE_PARSING_MANIFEST_MALFORMED) builder.setMimeType(MimeTypes.APPLICATION_OCTET); else if (errorCode == PlaybackException.ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED) builder.setMimeType(MimeTypes.APPLICATION_M3U8); if (!TextUtils.isEmpty(sub)) builder.setSubtitleConfigurations(getSubtitles(sub)); - builder.setDecode(Prefers.getDecode()); + builder.setAllowChunklessPreparation(Prefers.getDecode() == 1); return builder.build(); } From 1a7f4e923282c14415d4d152d77b7725721af98d Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 17:42:32 +0800 Subject: [PATCH 14/26] Update Updater.java --- app/src/main/java/com/fongmi/android/tv/api/Updater.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/Updater.java b/app/src/main/java/com/fongmi/android/tv/api/Updater.java index ae68253f0..c5f1bdd9f 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Updater.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Updater.java @@ -93,8 +93,9 @@ public class Updater implements View.OnClickListener { String name = object.optString("name"); String desc = object.optString("desc"); int code = object.optInt("code"); - if (code > BuildConfig.VERSION_CODE || force) FileUtil.write(getFile(), OKHttp.newCall(getApk()).execute().body().bytes()); - boolean show = Prefers.getUpdate() || !Prefers.getApkMd5().equals(md5 = FileUtil.getMd5(getFile())); + boolean need = code > BuildConfig.VERSION_CODE; + if (need || force) FileUtil.write(getFile(), OKHttp.newCall(getApk()).execute().body().bytes()); + boolean show = need && Prefers.getUpdate() || force && !Prefers.getApkMd5().equals(md5 = FileUtil.getMd5(getFile())); if (getFile().exists() && show) App.post(() -> checkActivity(name, desc)); } catch (Exception e) { e.printStackTrace(); From 2dbbb3664f57ac559faaf7eadf9ab2602908bc31 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 17:47:28 +0800 Subject: [PATCH 15/26] Update DetailActivity.java --- .../java/com/fongmi/android/tv/ui/activity/DetailActivity.java | 2 ++ 1 file changed, 2 insertions(+) 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 5b2a954ac..1170288c7 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 @@ -286,6 +286,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.scroll.scrollTo(0, 0); Clock.get().setCallback(null); Notify.progress(this); + mPlayers.stop(); + hideProgress(); getDetail(); } From a786f4c6209f92c0f9756cd108b9f6a98ca73368 Mon Sep 17 00:00:00 2001 From: FongMi Date: Sun, 4 Dec 2022 17:57:10 +0800 Subject: [PATCH 17/26] Update DetailActivity.java --- .../java/com/fongmi/android/tv/ui/activity/DetailActivity.java | 1 + 1 file changed, 1 insertion(+) 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 1170288c7..351923c15 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 @@ -851,6 +851,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } else if (mFullscreen) { exitFullscreen(); } else { + stopSearch(); super.onBackPressed(); } } From 1c2608e95713c0460a1eb501b2f22ba53538db3b Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 17:27:50 +0800 Subject: [PATCH 20/26] Default hardware decode --- app/src/main/java/com/fongmi/android/tv/utils/Prefers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8af95455e..1bcc668df 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 @@ -76,7 +76,7 @@ public class Prefers { } public static int getDecode() { - return getInt("decode", 0); + return getInt("decode", 1); } public static void putDecode(int decode) { From 5781d2b9046763f4956058a6721725f79f48eb05 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 18:43:50 +0800 Subject: [PATCH 21/26] Clean up code --- README.md | 8 ++++---- other/{live-offline.json => example/live/offline.json} | 0 other/{live-online.json => example/live/online.json} | 0 other/{vod-offline.json => example/vod/offline.json} | 0 other/{vod-online.json => example/vod/online.json} | 0 5 files changed, 4 insertions(+), 4 deletions(-) rename other/{live-offline.json => example/live/offline.json} (100%) rename other/{live-online.json => example/live/online.json} (100%) rename other/{vod-offline.json => example/vod/offline.json} (100%) rename other/{vod-online.json => example/vod/online.json} (100%) diff --git a/README.md b/README.md index 2fadb8628..1b573a1a5 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ https://github.com/CatVodTVOfficial/CatVodTVJarLoader [TV-Python](https://github.com/FongMi/TV/blob/main/release/leanback-python.apk?raw=true "TV-Python") ### Config Example -[Vod-Online](other/vod-online.json) -[Vod-Offline](other/vod-offline.json) -[Live-Online](other/live-online.json) -[Live-Offline](other/live-offline.json) +[Vod-Online](other/example/vod/online.json) +[Vod-Offline](other/example/vod/offline.json) +[Live-Online](other/example/live/online.json) +[Live-Offline](other/example/live/offline.json) ### Subtitle Format In playerContent put "sub" diff --git a/other/live-offline.json b/other/example/live/offline.json similarity index 100% rename from other/live-offline.json rename to other/example/live/offline.json diff --git a/other/live-online.json b/other/example/live/online.json similarity index 100% rename from other/live-online.json rename to other/example/live/online.json diff --git a/other/vod-offline.json b/other/example/vod/offline.json similarity index 100% rename from other/vod-offline.json rename to other/example/vod/offline.json diff --git a/other/vod-online.json b/other/example/vod/online.json similarity index 100% rename from other/vod-online.json rename to other/example/vod/online.json From e59aa92bce0faa4273fb1d616e53530f0e89a7f9 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 20:38:41 +0800 Subject: [PATCH 22/26] Clean code --- .../com/fongmi/android/tv/api/Updater.java | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/Updater.java b/app/src/main/java/com/fongmi/android/tv/api/Updater.java index c5f1bdd9f..830e733d9 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Updater.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Updater.java @@ -25,8 +25,6 @@ import java.lang.ref.WeakReference; public class Updater implements View.OnClickListener { - private static final String PROXY = "https://ghproxy.com/"; - private WeakReference activity; private AlertDialog dialog; private String branch; @@ -41,6 +39,22 @@ public class Updater implements View.OnClickListener { return Loader.INSTANCE; } + private File getFile() { + return FileUtil.getCacheFile(branch + ".apk"); + } + + private String getPath() { + return "https://raw.githubusercontent.com/FongMi/TV/" + branch + "/release/"; + } + + private String getJson() { + return "https://ghproxy.com/" + getPath() + BuildConfig.FLAVOR_mode + "-" + branch + ".json"; + } + + private String getApk() { + return "https://ghproxy.com/" + getPath() + BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"; + } + private Updater() { this.branch = "release"; } @@ -71,22 +85,6 @@ public class Updater implements View.OnClickListener { connect(getJson()); } - private File getFile() { - return FileUtil.getCacheFile(branch + ".apk"); - } - - private String getPath() { - return "https://raw.githubusercontent.com/FongMi/TV/" + branch + "/release/"; - } - - private String getJson() { - return PROXY + getPath() + BuildConfig.FLAVOR_mode + "-" + branch + ".json"; - } - - private String getApk() { - return PROXY + getPath() + BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"; - } - private void connect(String target) { try { JSONObject object = new JSONObject(OKHttp.newCall(target).execute().body().string()); From c5095ed7a6e2402745da26e3a34b25c48ea11ead Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 22:14:33 +0800 Subject: [PATCH 23/26] Update Force.java --- .../main/java/com/fongmi/android/tv/player/source/Force.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java index 69fa94372..67b2e8c13 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java @@ -37,7 +37,7 @@ public class Force { private void check() throws Exception { File file = FileUtil.getCacheFile("libmitv.so"); - String url = "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/TV/release/other/libmitv.so"; + String url = "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/TV/release/other/so/libmitv.so"; if (!file.exists()) FileUtil.write(file, OKHttp.newCall(url).execute().body().bytes()); } From 098642bd51a57674f13657a7df4515f93ff508dd Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 22:30:52 +0800 Subject: [PATCH 24/26] Clean code --- .../java/com/fongmi/android/tv/Constant.java | 18 ++++++++++++++++++ .../com/fongmi/android/tv/api/Updater.java | 13 +++++-------- .../fongmi/android/tv/player/source/Force.java | 3 ++- 3 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/com/fongmi/android/tv/Constant.java diff --git a/app/src/main/java/com/fongmi/android/tv/Constant.java b/app/src/main/java/com/fongmi/android/tv/Constant.java new file mode 100644 index 000000000..5f70de988 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/Constant.java @@ -0,0 +1,18 @@ +package com.fongmi.android.tv; + +public class Constant { + + public static final String PROXY = "https://ghproxy.com/"; + public static final String REPO = "https://raw.githubusercontent.com/FongMi/TV/"; + public static final String RELEASE = "release"; + public static final String KITKAT = "kitkat"; + public static final String DEV = "dev"; + + public static String getReleasePath(String path) { + return PROXY + REPO + RELEASE + path; + } + + public static String getBranchPath(String branch, String path) { + return PROXY + REPO + branch + path; + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/api/Updater.java b/app/src/main/java/com/fongmi/android/tv/api/Updater.java index 830e733d9..1e81fbadd 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Updater.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Updater.java @@ -9,6 +9,7 @@ import androidx.appcompat.app.AlertDialog; import com.fongmi.android.tv.App; import com.fongmi.android.tv.BuildConfig; +import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.R; import com.fongmi.android.tv.databinding.DialogUpdateBinding; import com.fongmi.android.tv.net.OKHttp; @@ -43,20 +44,16 @@ public class Updater implements View.OnClickListener { return FileUtil.getCacheFile(branch + ".apk"); } - private String getPath() { - return "https://raw.githubusercontent.com/FongMi/TV/" + branch + "/release/"; - } - private String getJson() { - return "https://ghproxy.com/" + getPath() + BuildConfig.FLAVOR_mode + "-" + branch + ".json"; + return Constant.getBranchPath(branch, "/release/" + BuildConfig.FLAVOR_mode + "-" + branch + ".json"); } private String getApk() { - return "https://ghproxy.com/" + getPath() + BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"; + return Constant.getBranchPath("/release/", BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"); } private Updater() { - this.branch = "release"; + this.branch = Constant.RELEASE; } public Updater reset() { @@ -123,7 +120,7 @@ public class Updater implements View.OnClickListener { private void dismiss() { if (dialog != null) dialog.dismiss(); - this.branch = "release"; + this.branch = Constant.RELEASE; this.force = false; this.md5 = null; } diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java index 67b2e8c13..c7bc58c15 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java @@ -9,6 +9,7 @@ import android.os.IBinder; import android.os.SystemClock; import com.fongmi.android.tv.App; +import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.utils.FileUtil; import com.forcetech.Port; @@ -37,7 +38,7 @@ public class Force { private void check() throws Exception { File file = FileUtil.getCacheFile("libmitv.so"); - String url = "https://ghproxy.com/https://raw.githubusercontent.com/FongMi/TV/release/other/so/libmitv.so"; + String url = Constant.getReleasePath("/other/so/libmitv.so"); if (!file.exists()) FileUtil.write(file, OKHttp.newCall(url).execute().body().bytes()); } From c9a1edfdb5fb43f7767b654be8c3195a4ad53df1 Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 22:35:06 +0800 Subject: [PATCH 25/26] Update Updater.java --- app/src/main/java/com/fongmi/android/tv/api/Updater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/fongmi/android/tv/api/Updater.java b/app/src/main/java/com/fongmi/android/tv/api/Updater.java index 1e81fbadd..e9aab773c 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Updater.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Updater.java @@ -49,7 +49,7 @@ public class Updater implements View.OnClickListener { } private String getApk() { - return Constant.getBranchPath("/release/", BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"); + return Constant.getBranchPath(branch, "/release/" + BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"); } private Updater() { From bd0104894d1fa3913c77177d3730d023352da70c Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 5 Dec 2022 22:46:45 +0800 Subject: [PATCH 26/26] Update to 1.4.7 --- README.md | 8 ++++---- app/build.gradle | 4 ++-- .../java/com/fongmi/android/tv/player/source/Force.java | 2 +- other/{example => sample}/live/offline.json | 0 other/{example => sample}/live/online.json | 0 other/{example => sample}/vod/offline.json | 0 other/{example => sample}/vod/online.json | 0 7 files changed, 7 insertions(+), 7 deletions(-) rename other/{example => sample}/live/offline.json (100%) rename other/{example => sample}/live/online.json (100%) rename other/{example => sample}/vod/offline.json (100%) rename other/{example => sample}/vod/online.json (100%) diff --git a/README.md b/README.md index 1b573a1a5..71fbae2a5 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ https://github.com/CatVodTVOfficial/CatVodTVJarLoader [TV-Python](https://github.com/FongMi/TV/blob/main/release/leanback-python.apk?raw=true "TV-Python") ### Config Example -[Vod-Online](other/example/vod/online.json) -[Vod-Offline](other/example/vod/offline.json) -[Live-Online](other/example/live/online.json) -[Live-Offline](other/example/live/offline.json) +[Vod-Online](other/sample/vod/online.json) +[Vod-Offline](other/sample/vod/offline.json) +[Live-Online](other/sample/live/online.json) +[Live-Offline](other/sample/live/offline.json) ### Subtitle Format In playerContent put "sub" diff --git a/app/build.gradle b/app/build.gradle index 730b081ea..afaff752b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.fongmi.android.tv" minSdk 21 targetSdk 33 - versionCode 46 - versionName "1.4.6" + versionCode 47 + versionName "1.4.7" ndk { abiFilters "armeabi-v7a" } } diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java index c7bc58c15..a86cb2d81 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java @@ -38,7 +38,7 @@ public class Force { private void check() throws Exception { File file = FileUtil.getCacheFile("libmitv.so"); - String url = Constant.getReleasePath("/other/so/libmitv.so"); + String url = Constant.getReleasePath("/other/libmitv.so"); if (!file.exists()) FileUtil.write(file, OKHttp.newCall(url).execute().body().bytes()); } diff --git a/other/example/live/offline.json b/other/sample/live/offline.json similarity index 100% rename from other/example/live/offline.json rename to other/sample/live/offline.json diff --git a/other/example/live/online.json b/other/sample/live/online.json similarity index 100% rename from other/example/live/online.json rename to other/sample/live/online.json diff --git a/other/example/vod/offline.json b/other/sample/vod/offline.json similarity index 100% rename from other/example/vod/offline.json rename to other/sample/vod/offline.json diff --git a/other/example/vod/online.json b/other/sample/vod/online.json similarity index 100% rename from other/example/vod/online.json rename to other/sample/vod/online.json