From a0eb5581babc818e90636911019cac19073f7540 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 3 Jan 2023 19:06:11 +0800 Subject: [PATCH] Support track - part 1 --- .../tv/ui/activity/DetailActivity.java | 14 +++- .../android/tv/ui/activity/LiveActivity.java | 14 +++- .../leanback/res/layout/adapter_config.xml | 8 +-- app/src/leanback/res/layout/adapter_live.xml | 5 +- app/src/leanback/res/layout/adapter_vod.xml | 2 +- app/src/leanback/res/layout/dialog_track.xml | 8 +++ .../leanback/res/layout/view_control_live.xml | 20 +++++- .../leanback/res/layout/view_control_vod.xml | 19 ++++- .../com/fongmi/android/tv/bean/Track.java | 10 +++ .../com/fongmi/android/tv/player/ExoUtil.java | 6 ++ .../com/fongmi/android/tv/player/Players.java | 4 ++ .../android/tv/ui/adapter/TrackAdapter.java | 69 +++++++++++++++++++ .../tv/ui/custom/TrackSelectionDialog2.java | 66 ++++++++++++++++++ .../main/res/drawable/ic_delete_config.xml | 10 +++ .../{ic_delete.xml => ic_delete_vod.xml} | 0 app/src/main/res/layout/adapter_track.xml | 22 ++++++ app/src/main/res/values-zh-rCN/strings.xml | 4 +- app/src/main/res/values-zh-rTW/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- .../ijk/media/player/ui/IjkVideoView.java | 8 +++ 20 files changed, 276 insertions(+), 21 deletions(-) create mode 100644 app/src/leanback/res/layout/dialog_track.xml create mode 100644 app/src/main/java/com/fongmi/android/tv/bean/Track.java create mode 100644 app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java create mode 100644 app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog2.java create mode 100644 app/src/main/res/drawable/ic_delete_config.xml rename app/src/main/res/drawable/{ic_delete.xml => ic_delete_vod.xml} (100%) create mode 100644 app/src/main/res/layout/adapter_track.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 ce784f68d..aa54a1612 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 @@ -40,6 +40,7 @@ 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.TrackSelectionDialog2; import com.fongmi.android.tv.ui.custom.dialog.DescDialog; import com.fongmi.android.tv.ui.presenter.ArrayPresenter; import com.fongmi.android.tv.ui.presenter.EpisodePresenter; @@ -184,11 +185,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.video.setOnClickListener(view -> onVideo()); mBinding.control.next.setOnClickListener(view -> checkNext()); mBinding.control.prev.setOnClickListener(view -> checkPrev()); + mBinding.control.text.setOnClickListener(view -> onTracks()); + mBinding.control.audio.setOnClickListener(view -> onTracks()); mBinding.control.scale.setOnClickListener(view -> onScale()); mBinding.control.speed.setOnClickListener(view -> onSpeed()); mBinding.control.player.setOnClickListener(view -> onPlayer()); mBinding.control.decode.setOnClickListener(view -> onDecode()); - mBinding.control.tracks.setOnClickListener(view -> onTracks()); mBinding.control.ending.setOnClickListener(view -> onEnding()); mBinding.control.opening.setOnClickListener(view -> onOpening()); mBinding.control.replay.setOnClickListener(view -> getPlayer(true)); @@ -567,7 +569,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mPlayers.stop(); mPlayers.togglePlayer(); mHistory.setPlayer(mPlayers.getPlayer()); - mBinding.control.tracks.setVisibility(View.GONE); getPlayer(false); setPlayerView(); } @@ -743,8 +744,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis case Player.STATE_READY: hideProgress(); mPlayers.reset(); + setTrackVisible(); mBinding.widget.size.setText(mPlayers.getSizeText()); - TrackSelectionDialog.setVisible(mPlayers.exo(), mBinding.control.tracks); break; case Player.STATE_ENDED: checkNext(); @@ -761,6 +762,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis Clock.get().setCallback(this); } + private void setTrackVisible() { + boolean textVisible = TrackSelectionDialog2.haveTrack(mPlayers, 3); + boolean audioVisible = TrackSelectionDialog2.haveTrack(mPlayers, 1); + mBinding.control.text.setVisibility(textVisible ? View.VISIBLE : View.GONE); + mBinding.control.audio.setVisibility(audioVisible ? View.VISIBLE : View.GONE); + } + private void onError(String msg) { int position = mBinding.flag.getSelectedPosition(); if (position == mFlagAdapter.size() - 1) { 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 e9154225d..d2da87f1b 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 @@ -36,6 +36,7 @@ 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.TrackSelectionDialog2; import com.fongmi.android.tv.ui.custom.dialog.LiveDialog; import com.fongmi.android.tv.ui.custom.dialog.PassDialog; import com.fongmi.android.tv.ui.presenter.ChannelPresenter; @@ -144,11 +145,12 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mBinding.control.home.setOnClickListener(view -> onHome()); mBinding.control.scale.setOnClickListener(view -> onScale()); mBinding.control.speed.setOnClickListener(view -> onSpeed()); + mBinding.control.text.setOnClickListener(view -> onTracks()); + mBinding.control.audio.setOnClickListener(view -> onTracks()); mBinding.control.invert.setOnClickListener(view -> onInvert()); mBinding.control.across.setOnClickListener(view -> onAcross()); mBinding.control.player.setOnClickListener(view -> onPlayer()); mBinding.control.decode.setOnClickListener(view -> onDecode()); - mBinding.control.tracks.setOnClickListener(view -> onTracks()); mBinding.control.line.setOnClickListener(view -> nextLine(false)); mBinding.control.speed.setOnLongClickListener(view -> onSpeedLong()); mBinding.group.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @@ -304,7 +306,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void onPlayer() { mPlayers.stop(); mPlayers.togglePlayer(); - mBinding.control.tracks.setVisibility(View.GONE); setPlayerView(); getUrl(); } @@ -644,8 +645,8 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick case Player.STATE_READY: hideProgress(); mPlayers.reset(); + setTrackVisible(); App.removeCallbacks(mR6); - TrackSelectionDialog.setVisible(mPlayers.exo(), mBinding.control.tracks); break; case Player.STATE_ENDED: onKeyDown(); @@ -658,6 +659,13 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } } + private void setTrackVisible() { + boolean textVisible = TrackSelectionDialog2.haveTrack(mPlayers, 3); + boolean audioVisible = TrackSelectionDialog2.haveTrack(mPlayers, 1); + mBinding.control.text.setVisibility(textVisible ? View.VISIBLE : View.GONE); + mBinding.control.audio.setVisibility(audioVisible ? View.VISIBLE : View.GONE); + } + private void onError() { mPlayers.reset(); if (mChannel.isLastLine()) { diff --git a/app/src/leanback/res/layout/adapter_config.xml b/app/src/leanback/res/layout/adapter_config.xml index 4c53705b3..27f24efb4 100644 --- a/app/src/leanback/res/layout/adapter_config.xml +++ b/app/src/leanback/res/layout/adapter_config.xml @@ -8,7 +8,7 @@ + android:src="@drawable/ic_delete_config" /> \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_live.xml b/app/src/leanback/res/layout/adapter_live.xml index 37be356a2..f423ca28e 100644 --- a/app/src/leanback/res/layout/adapter_live.xml +++ b/app/src/leanback/res/layout/adapter_live.xml @@ -7,9 +7,8 @@ diff --git a/app/src/leanback/res/layout/dialog_track.xml b/app/src/leanback/res/layout/dialog_track.xml new file mode 100644 index 000000000..1f4d8457d --- /dev/null +++ b/app/src/leanback/res/layout/dialog_track.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/view_control_live.xml b/app/src/leanback/res/layout/view_control_live.xml index 19f3fa37d..584ea1548 100644 --- a/app/src/leanback/res/layout/view_control_live.xml +++ b/app/src/leanback/res/layout/view_control_live.xml @@ -125,14 +125,30 @@ tools:text="預設" /> + + + + { + + private final OnClickListener mListener; + private final List mItems; + + public TrackAdapter(OnClickListener listener) { + this.mListener = listener; + this.mItems = new ArrayList<>(); + } + + public interface OnClickListener { + + void onItemClick(Track item); + } + + public void addAll(List items) { + mItems.clear(); + mItems.addAll(items); + notifyDataSetChanged(); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterTrackBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + Track item = mItems.get(position); + holder.binding.text.setText(item.getName()); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + + private final AdapterTrackBinding binding; + + public ViewHolder(@NonNull AdapterTrackBinding binding) { + super(binding.getRoot()); + this.binding = binding; + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + mListener.onItemClick(mItems.get(getLayoutPosition())); + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog2.java b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog2.java new file mode 100644 index 000000000..495f0f36b --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog2.java @@ -0,0 +1,66 @@ +package com.fongmi.android.tv.ui.custom; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.WindowManager; + +import androidx.appcompat.app.AlertDialog; + +import com.fongmi.android.tv.bean.Track; +import com.fongmi.android.tv.databinding.DialogTrackBinding; +import com.fongmi.android.tv.player.ExoUtil; +import com.fongmi.android.tv.player.Players; +import com.fongmi.android.tv.ui.adapter.TrackAdapter; +import com.fongmi.android.tv.utils.ResUtil; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +public final class TrackSelectionDialog2 implements TrackAdapter.OnClickListener { + + private final DialogTrackBinding binding; + private final TrackAdapter adapter; + private final AlertDialog dialog; + private int trackType; + + public static TrackSelectionDialog2 create(Activity activity) { + return new TrackSelectionDialog2(activity); + } + + public TrackSelectionDialog2(Activity activity) { + this.binding = DialogTrackBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + this.adapter = new TrackAdapter(this); + } + + public void show() { + setRecyclerView(); + setDialog(); + } + + private void setRecyclerView() { + binding.recycler.setHasFixedSize(true); + binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); + binding.recycler.setAdapter(adapter); + } + + private void setDialog() { + if (adapter.getItemCount() == 0) return; + WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); + params.width = (int) (ResUtil.getScreenWidthPx() * 0.4f); + dialog.getWindow().setAttributes(params); + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + public static boolean haveTrack(Players player, int type) { + if (player.isExo()) { + return ExoUtil.haveTrack(player.exo().getCurrentTracks(), type); + } else { + return player.ijk().haveTrack(type); + } + } + + @Override + public void onItemClick(Track item) { + + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_delete_config.xml b/app/src/main/res/drawable/ic_delete_config.xml new file mode 100644 index 000000000..fe52cfac3 --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_config.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete_vod.xml similarity index 100% rename from app/src/main/res/drawable/ic_delete.xml rename to app/src/main/res/drawable/ic_delete_vod.xml diff --git a/app/src/main/res/layout/adapter_track.xml b/app/src/main/res/layout/adapter_track.xml new file mode 100644 index 000000000..d127eece7 --- /dev/null +++ b/app/src/main/res/layout/adapter_track.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8485b525f..83419b6e4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -43,7 +43,9 @@ 准备播放:%s 重播 重置 - 轨道 + 轨道 + 字幕 + 音频 反转 跨类 片头 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e433c8e28..3a6f59f7a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -43,7 +43,9 @@ 準備播放:%s 重播 重置 - 軌道 + 軌道 + 字幕 + 音訊 反轉 跨類 片頭 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 18141b45d..f41a3a0bf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,7 +43,9 @@ Ready to play: %s Replay Reset - Tracks + Tracks + Text + Audio Invert Across OP 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 5390f80bf..8c498c81e 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 @@ -22,6 +22,7 @@ import tv.danmaku.ijk.media.player.IMediaPlayer; import tv.danmaku.ijk.media.player.IjkMediaPlayer; import tv.danmaku.ijk.media.player.IjkTimedText; import tv.danmaku.ijk.media.player.R; +import tv.danmaku.ijk.media.player.misc.IjkTrackInfo; public class IjkVideoView extends FrameLayout implements MediaController.MediaPlayerControl { @@ -490,6 +491,13 @@ public class IjkVideoView extends FrameLayout implements MediaController.MediaPl return 0; } + public boolean haveTrack(int type) { + IjkTrackInfo[] trackInfo = mIjkPlayer.getTrackInfo(); + if (trackInfo == null) return false; + for (IjkTrackInfo info : trackInfo) if (info.getTrackType() == type) return true; + return false; + } + private void createPlayer() { mIjkPlayer = new IjkMediaPlayer(); IjkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_SILENT);