Support track - part 1

pull/123/head
FongMi 3 years ago
parent 8b0fd6e2ea
commit a0eb5581ba
  1. 14
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 14
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java
  3. 8
      app/src/leanback/res/layout/adapter_config.xml
  4. 5
      app/src/leanback/res/layout/adapter_live.xml
  5. 2
      app/src/leanback/res/layout/adapter_vod.xml
  6. 8
      app/src/leanback/res/layout/dialog_track.xml
  7. 20
      app/src/leanback/res/layout/view_control_live.xml
  8. 19
      app/src/leanback/res/layout/view_control_vod.xml
  9. 10
      app/src/main/java/com/fongmi/android/tv/bean/Track.java
  10. 6
      app/src/main/java/com/fongmi/android/tv/player/ExoUtil.java
  11. 4
      app/src/main/java/com/fongmi/android/tv/player/Players.java
  12. 69
      app/src/main/java/com/fongmi/android/tv/ui/adapter/TrackAdapter.java
  13. 66
      app/src/main/java/com/fongmi/android/tv/ui/custom/TrackSelectionDialog2.java
  14. 10
      app/src/main/res/drawable/ic_delete_config.xml
  15. 0
      app/src/main/res/drawable/ic_delete_vod.xml
  16. 22
      app/src/main/res/layout/adapter_track.xml
  17. 4
      app/src/main/res/values-zh-rCN/strings.xml
  18. 4
      app/src/main/res/values-zh-rTW/strings.xml
  19. 4
      app/src/main/res/values/strings.xml
  20. 8
      ijkplayer/src/main/java/tv/danmaku/ijk/media/player/ui/IjkVideoView.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) {

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

@ -8,7 +8,7 @@
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/selector_text"
android:ellipsize="middle"
@ -22,14 +22,14 @@
<ImageView
android:id="@+id/delete"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:padding="8dp"
android:scaleType="fitCenter"
android:src="@drawable/ic_delete" />
android:src="@drawable/ic_delete_config" />
</LinearLayout>

@ -7,9 +7,8 @@
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_text"
android:ellipsize="middle"
android:focusable="true"

@ -22,7 +22,7 @@
android:layout_height="match_parent"
android:background="@color/black_50"
android:scaleType="center"
android:src="@drawable/ic_delete"
android:src="@drawable/ic_delete_vod"
android:visibility="gone"
app:shapeAppearanceOverlay="@style/VodStyle"
tools:visibility="visible" />

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

@ -125,14 +125,30 @@
tools:text="預設" />
<TextView
android:id="@+id/tracks"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="@string/play_tracks"
android:nextFocusDown="@id/parse"
android:text="@string/play_track_text"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@id/parse"
android:text="@string/play_track_audio"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"

@ -125,7 +125,7 @@
tools:text="預設" />
<TextView
android:id="@+id/tracks"
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
@ -133,7 +133,22 @@
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@id/parse"
android:text="@string/play_tracks"
android:text="@string/play_track_text"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"
tools:visibility="visible" />
<TextView
android:id="@+id/audio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/selector_text"
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@id/parse"
android:text="@string/play_track_audio"
android:textColor="@color/white"
android:textSize="14sp"
android:visibility="gone"

@ -0,0 +1,10 @@
package com.fongmi.android.tv.bean;
public class Track {
private String name;
public String getName() {
return name;
}
}

@ -12,6 +12,7 @@ import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.PlaybackException;
import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.Tracks;
import com.google.android.exoplayer2.database.DatabaseProvider;
import com.google.android.exoplayer2.database.StandaloneDatabaseProvider;
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory;
@ -60,6 +61,11 @@ public class ExoUtil {
return new CaptionStyleCompat(Color.WHITE, Color.TRANSPARENT, Color.TRANSPARENT, CaptionStyleCompat.EDGE_TYPE_OUTLINE, Color.BLACK, null);
}
public static boolean haveTrack(Tracks tracks, int type) {
for (Tracks.Group trackGroup : tracks.getGroups()) if (type == trackGroup.getType()) return true;
return false;
}
public static MediaSource getSource(Result result, int errorCode) {
return getSource(result.getHeaders(), result.getPlayUrl() + result.getUrl(), result.getSub(), errorCode);
}

@ -76,6 +76,10 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM
return exoPlayer;
}
public IjkVideoView ijk() {
return ijkPlayer;
}
public int getPlayer() {
return player;
}

@ -0,0 +1,69 @@
package com.fongmi.android.tv.ui.adapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.fongmi.android.tv.bean.Track;
import com.fongmi.android.tv.databinding.AdapterTrackBinding;
import java.util.ArrayList;
import java.util.List;
public class TrackAdapter extends RecyclerView.Adapter<TrackAdapter.ViewHolder> {
private final OnClickListener mListener;
private final List<Track> mItems;
public TrackAdapter(OnClickListener listener) {
this.mListener = listener;
this.mItems = new ArrayList<>();
}
public interface OnClickListener {
void onItemClick(Track item);
}
public void addAll(List<Track> 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()));
}
}
}

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

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="#FFFFFF"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M16,9v10H8V9h8m-1.5,-6h-5l-1,1H5v2h14V4h-3.5l-1,-1zM18,7H6v12c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7z" />
</vector>

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_text"
android:ellipsize="middle"
android:focusable="true"
android:focusableInTouchMode="true"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/text"
android:textSize="18sp"
tools:text="中文、哥斯拉.srt" />
</LinearLayout>

@ -43,7 +43,9 @@
<string name="play_ready">准备播放:<xliff:g name="name">%s</xliff:g></string>
<string name="play_replay">重播</string>
<string name="play_reset">重置</string>
<string name="play_tracks">轨道</string>
<string name="play_track">轨道</string>
<string name="play_track_text">字幕</string>
<string name="play_track_audio">音频</string>
<string name="play_invert">反转</string>
<string name="play_across">跨类</string>
<string name="play_op">片头</string>

@ -43,7 +43,9 @@
<string name="play_ready">準備播放:<xliff:g name="name">%s</xliff:g></string>
<string name="play_replay">重播</string>
<string name="play_reset">重置</string>
<string name="play_tracks">軌道</string>
<string name="play_track">軌道</string>
<string name="play_track_text">字幕</string>
<string name="play_track_audio">音訊</string>
<string name="play_invert">反轉</string>
<string name="play_across">跨類</string>
<string name="play_op">片頭</string>

@ -43,7 +43,9 @@
<string name="play_ready">Ready to play: <xliff:g name="name">%s</xliff:g></string>
<string name="play_replay">Replay</string>
<string name="play_reset">Reset</string>
<string name="play_tracks">Tracks</string>
<string name="play_track">Tracks</string>
<string name="play_track_text">Text</string>
<string name="play_track_audio">Audio</string>
<string name="play_invert">Invert</string>
<string name="play_across">Across</string>
<string name="play_op">OP</string>

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

Loading…
Cancel
Save