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 4a420cf20..dbefba8b8 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 @@ -42,8 +42,8 @@ import com.fongmi.android.tv.net.OkHttp; import com.fongmi.android.tv.player.ExoUtil; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; -import com.fongmi.android.tv.ui.custom.TrackSelectionDialog; import com.fongmi.android.tv.ui.custom.dialog.DescDialog; +import com.fongmi.android.tv.ui.custom.dialog.TrackDialog; import com.fongmi.android.tv.ui.presenter.ArrayPresenter; import com.fongmi.android.tv.ui.presenter.EpisodePresenter; import com.fongmi.android.tv.ui.presenter.FlagPresenter; @@ -76,7 +76,7 @@ import okhttp3.Call; import okhttp3.Response; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, TrackSelectionDialog.Listener, ArrayPresenter.OnClickListener, Clock.Callback { +public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, TrackDialog.Listener, ArrayPresenter.OnClickListener, Clock.Callback { private ActivityDetailBinding mBinding; private ViewGroup.LayoutParams mFrameParams; @@ -350,8 +350,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mFlagAdapter.setItems(item.getVodFlags(), null); mBinding.content.setMaxLines(getMaxLines()); mBinding.video.requestFocus(); - if (hasFlag()) checkHistory(); getPart(item.getVodName()); + checkFlag(item); checkKeep(); } @@ -585,7 +585,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onTrack(View view) { int type = Integer.parseInt(view.getTag().toString()); - TrackSelectionDialog.create(this).player(mPlayers).type(type).listener(this).show(); + TrackDialog.create(this).player(mPlayers).type(type).listener(this).show(); hideControl(); } @@ -668,18 +668,15 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis }); } - private boolean hasFlag() { - mBinding.flag.setVisibility(mFlagAdapter.size() > 0 ? View.VISIBLE : View.GONE); - if (mFlagAdapter.size() > 0) return true; - Notify.show(R.string.error_episode); - initSearch(getName(), true); - hideProgress(); - return false; + private void checkFlag(Vod item) { + mBinding.flag.setVisibility(item.getVodFlags().isEmpty() ? View.GONE : View.VISIBLE); + if (isVisible(mBinding.flag)) checkHistory(item); + else ErrorEvent.episode(); } - private void checkHistory() { + private void checkHistory(Vod item) { mHistory = History.find(getHistoryKey()); - mHistory = mHistory == null ? createHistory() : mHistory; + mHistory = mHistory == null ? createHistory(item) : mHistory; setFlagActivated(mHistory.getFlag()); if (mHistory.isRevSort()) reverseEpisode(); setScale(mHistory.getScale() == -1 ? Prefers.getScale() : mHistory.getScale()); @@ -691,13 +688,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis setDecodeView(); } - private History createHistory() { + private History createHistory(Vod item) { History history = new History(); history.setKey(getHistoryKey()); history.setCid(ApiConfig.getCid()); - history.setVodPic(mBinding.video.getTag().toString()); - history.setVodName(mBinding.name.getText().toString()); - history.findEpisode(mFlagAdapter); + history.setVodPic(item.getVodPic()); + history.setVodName(item.getVodName()); + history.findEpisode(item.getVodFlags()); return history; } @@ -920,11 +917,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis this.mInitTrack = initTrack; } - public boolean isInitAuto() { + private boolean isInitAuto() { return mInitAuto; } - public void setInitAuto(boolean initAuto) { + private void setInitAuto(boolean initAuto) { this.mInitAuto = initAuto; } @@ -936,6 +933,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis this.mAutoMode = autoMode; } + private void notifyItemChanged(RecyclerView view, ArrayObjectAdapter adapter) { + if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size()); + } + @Override public boolean dispatchKeyEvent(KeyEvent event) { if (isFullscreen() && Utils.isMenuKey(event)) onToggle(); 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 ad4064678..5d6d24ca3 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 @@ -38,9 +38,9 @@ import com.fongmi.android.tv.player.source.TVBus; import com.fongmi.android.tv.player.source.ZLive; import com.fongmi.android.tv.ui.custom.CustomKeyDownLive; import com.fongmi.android.tv.ui.custom.CustomLiveListView; -import com.fongmi.android.tv.ui.custom.TrackSelectionDialog; import com.fongmi.android.tv.ui.custom.dialog.LiveDialog; import com.fongmi.android.tv.ui.custom.dialog.PassDialog; +import com.fongmi.android.tv.ui.custom.dialog.TrackDialog; import com.fongmi.android.tv.ui.presenter.ChannelPresenter; import com.fongmi.android.tv.ui.presenter.GroupPresenter; import com.fongmi.android.tv.utils.Clock; @@ -322,7 +322,7 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void onTrack(View view) { int type = Integer.parseInt(view.getTag().toString()); - TrackSelectionDialog.create(this).player(mPlayers).type(type).show(); + TrackDialog.create(this).player(mPlayers).type(type).show(); hideControl(); } @@ -492,6 +492,10 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick getUrl(); } + private void notifyItemChanged(RecyclerView view, ArrayObjectAdapter adapter) { + if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size()); + } + @Override public boolean nextGroup(boolean skip) { int position = mBinding.group.getSelectedPosition() + 1; diff --git a/app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java similarity index 100% rename from app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java similarity index 87% rename from app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java rename to app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java index 282a9ac67..0e77b2924 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/custom/dialog/TrackDialog.java @@ -1,4 +1,4 @@ -package com.fongmi.android.tv.ui.custom; +package com.fongmi.android.tv.ui.custom.dialog; import android.app.Activity; import android.view.LayoutInflater; @@ -10,6 +10,8 @@ import com.fongmi.android.tv.bean.Track; import com.fongmi.android.tv.databinding.DialogTrackBinding; import com.fongmi.android.tv.player.Players; import com.fongmi.android.tv.ui.adapter.TrackAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; +import com.fongmi.android.tv.ui.custom.TrackNameProvider; import com.fongmi.android.tv.utils.ResUtil; import com.google.android.exoplayer2.Tracks; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -19,7 +21,7 @@ import java.util.List; import tv.danmaku.ijk.media.player.misc.IjkTrackInfo; -public final class TrackSelectionDialog implements TrackAdapter.OnClickListener { +public final class TrackDialog implements TrackAdapter.OnClickListener { private final DialogTrackBinding binding; private final TrackNameProvider provider; @@ -29,28 +31,28 @@ public final class TrackSelectionDialog implements TrackAdapter.OnClickListener private Players player; private int type; - public static TrackSelectionDialog create(Activity activity) { - return new TrackSelectionDialog(activity); + public static TrackDialog create(Activity activity) { + return new TrackDialog(activity); } - public TrackSelectionDialog(Activity activity) { + public TrackDialog(Activity activity) { this.binding = DialogTrackBinding.inflate(LayoutInflater.from(activity)); this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); this.adapter = new TrackAdapter(this); this.provider = new TrackNameProvider(); } - public TrackSelectionDialog type(int type) { + public TrackDialog type(int type) { this.type = type; return this; } - public TrackSelectionDialog player(Players player) { + public TrackDialog player(Players player) { this.player = player; return this; } - public TrackSelectionDialog listener(Listener listener) { + public TrackDialog listener(Listener listener) { this.listener = listener; return this; } diff --git a/app/src/main/res/layout/adapter_track.xml b/app/src/leanback/res/layout/adapter_track.xml similarity index 100% rename from app/src/main/res/layout/adapter_track.xml rename to app/src/leanback/res/layout/adapter_track.xml diff --git a/app/src/main/java/com/fongmi/android/tv/bean/History.java b/app/src/main/java/com/fongmi/android/tv/bean/History.java index 78b1f525c..06a5a4b7b 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/History.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/History.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.bean; import androidx.annotation.NonNull; -import androidx.leanback.widget.ArrayObjectAdapter; import androidx.room.Entity; import androidx.room.PrimaryKey; @@ -238,14 +237,12 @@ public class History { return this; } - public void findEpisode(ArrayObjectAdapter adapter) { - Vod.Flag flag = (Vod.Flag) adapter.get(0); - setVodFlag(flag.getFlag()); - setVodRemarks(flag.getEpisodes().get(0).getName()); + public void findEpisode(List flags) { + setVodFlag(flags.get(0).getFlag()); + setVodRemarks(flags.get(0).getEpisodes().get(0).getName()); for (History item : AppDatabase.get().getHistoryDao().findByName(ApiConfig.getCid(), getVodName())) { if (getPosition() > 0) break; - for (int i = 0; i < adapter.size(); i++) { - flag = (Vod.Flag) adapter.get(i); + for (Vod.Flag flag : flags) { Vod.Flag.Episode episode = flag.find(item.getVodRemarks()); if (episode == null) continue; setVodFlag(flag.getFlag()); diff --git a/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java b/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java index 9fe458795..18dab2acd 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/ErrorEvent.java @@ -22,6 +22,10 @@ public class ErrorEvent { EventBus.getDefault().post(new ErrorEvent(Type.FORMAT, true)); } + public static void episode() { + EventBus.getDefault().post(new ErrorEvent(Type.EPISODE, false)); + } + public static void timeout() { EventBus.getDefault().post(new ErrorEvent(Type.TIMEOUT, false)); } @@ -35,6 +39,7 @@ public class ErrorEvent { if (type == Type.URL) return R.string.error_play_url; if (type == Type.PARSE) return R.string.error_play_parse; if (type == Type.FORMAT) return R.string.error_play_format; + if (type == Type.EPISODE) return R.string.error_play_episode; if (type == Type.TIMEOUT) return R.string.error_play_timeout; return -1; } @@ -56,6 +61,6 @@ public class ErrorEvent { } public enum Type { - URL, PARSE, FORMAT, TIMEOUT + URL, PARSE, FORMAT, EPISODE, TIMEOUT } } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java b/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java index cff19b313..eb34d06e8 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java @@ -8,8 +8,6 @@ import android.os.Bundle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import androidx.leanback.widget.ArrayObjectAdapter; -import androidx.recyclerview.widget.RecyclerView; import androidx.viewbinding.ViewBinding; import com.fongmi.android.tv.R; @@ -53,10 +51,6 @@ public abstract class BaseActivity extends AppCompatActivity { protected void initEvent() { } - protected void notifyItemChanged(RecyclerView view, ArrayObjectAdapter adapter) { - if (!view.isComputingLayout()) adapter.notifyArrayItemRangeChanged(0, adapter.size()); - } - private void setWall() { try { File file = FileUtil.getWall(Prefers.getWall()); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java index 55e68732c..8b25eb901 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ImgUtil.java @@ -40,8 +40,8 @@ public class ImgUtil { public static void loadLive(String url, ImageView view) { view.setVisibility(TextUtils.isEmpty(url) ? View.GONE : View.VISIBLE); - if (TextUtils.isEmpty(url)) view.setImageResource(R.drawable.ic_live); - else Glide.with(App.get()).asBitmap().load(url).skipMemoryCache(true).dontAnimate().signature(new ObjectKey(url)).error(R.drawable.ic_live).into(view); + if (TextUtils.isEmpty(url)) view.setImageResource(R.drawable.ic_img_empty); + else Glide.with(App.get()).asBitmap().load(url).skipMemoryCache(true).dontAnimate().signature(new ObjectKey(url)).error(R.drawable.ic_img_empty).into(view); } public static GlideUrl getUrl(String url) { diff --git a/app/src/main/res/drawable-hdpi/ic_img_empty.png b/app/src/main/res/drawable-hdpi/ic_img_empty.png new file mode 100644 index 000000000..f6e474d98 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_img_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_img_empty.png b/app/src/main/res/drawable-mdpi/ic_img_empty.png new file mode 100644 index 000000000..577822ada Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_img_empty.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_img_empty.png b/app/src/main/res/drawable-xhdpi/ic_img_empty.png new file mode 100644 index 000000000..2b141f9ca Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_img_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_img_empty.png b/app/src/main/res/drawable-xxhdpi/ic_img_empty.png new file mode 100644 index 000000000..b862ac6b6 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_img_empty.png differ diff --git a/app/src/leanback/res/layout/view_control_seek.xml b/app/src/main/res/layout/view_control_seek.xml similarity index 100% rename from app/src/leanback/res/layout/view_control_seek.xml rename to app/src/main/res/layout/view_control_seek.xml diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 3a2d182b5..d2f196118 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -4,9 +4,6 @@ 影视 再按一次返回键退出 - - 正在加载配置 - 上次看到%s @@ -88,7 +85,7 @@ 播放数据加载失败 不支援的影片格式 连接超时 - 暂无播放数据 + 暂无播放数据 找不到数据 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b52dfb1e8..c15178d76 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -4,9 +4,6 @@ 影視 再按一次返回鍵退出 - - 正在載入配置 - 上次看到%s @@ -88,7 +85,7 @@ 播放資料載入失敗 不支援的影片格式 連線逾時 - 暫無播放資料 + 暫無播放資料 找不到資料 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 18679904c..cf94a147b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,9 +4,6 @@ TV Press back again to exit - - Loading configuration - Last seen %s @@ -88,7 +85,7 @@ Unable to load url Unsupported video format Timed out - No episode data + No episode data Not found