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 1116feda7..f4bf3d9d2 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 @@ -26,6 +26,7 @@ import com.fongmi.android.tv.bean.Keep; import com.fongmi.android.tv.bean.Parse; import com.fongmi.android.tv.bean.Part; import com.fongmi.android.tv.bean.Result; +import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.bean.Vod; import com.fongmi.android.tv.databinding.ActivityDetailBinding; import com.fongmi.android.tv.db.AppDatabase; @@ -113,6 +114,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis return getKey().concat(AppDatabase.SYMBOL).concat(getId()); } + private Site getSite() { + return ApiConfig.get().getSite(getKey()); + } + private Vod.Flag getVodFlag() { return (Vod.Flag) mFlagAdapter.get(mBinding.flag.getSelectedPosition()); } @@ -122,6 +127,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis return 0; } + private int getPlayerType() { + return mHistory != null && mHistory.getPlayer() != -1 ? mHistory.getPlayer() : getSite().getPlayerType() != -1 ? getSite().getPlayerType() : Prefers.getPlayer(); + } + private StyledPlayerView getExo() { return Prefers.getRender() == 0 ? mBinding.surface : mBinding.texture; } @@ -152,7 +161,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mR1 = this::hideControl; mR2 = this::hideCenter; setRecyclerView(); - setPlayerView(); setVideoView(); setViewModel(); getDetail(); @@ -211,19 +219,21 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void setPlayerView() { + mBinding.control.player.setText(mPlayers.getPlayerText()); getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE); getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE); } + private void setDecodeView() { + mBinding.control.decode.setText(mPlayers.getDecodeText()); + } + private void setVideoView() { mPlayers.setupIjk(getIjk()); + mPlayers.setupExo(getExo()); setScale(Prefers.getVodScale()); - getExo().setPlayer(mPlayers.exo()); getIjk().setRender(Prefers.getRender()); - getIjk().setDecode(Prefers.getDecode()); getExo().getSubtitleView().setStyle(ExoUtil.getCaptionStyle()); - mBinding.control.player.setText(ResUtil.getStringArray(R.array.select_player)[Prefers.getPlayer()]); - mBinding.control.decode.setText(ResUtil.getStringArray(R.array.select_decode)[Prefers.getDecode()]); } private void setScale(int scale) { @@ -275,7 +285,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis setText(mBinding.year, R.string.detail_year, item.getVodYear()); setText(mBinding.area, R.string.detail_area, item.getVodArea()); setText(mBinding.type, R.string.detail_type, item.getTypeName()); - setText(mBinding.site, R.string.detail_site, ApiConfig.getSiteName(getKey())); + setText(mBinding.site, R.string.detail_site, getSite().getName()); setText(mBinding.actor, R.string.detail_actor, Html.fromHtml(item.getVodActor()).toString()); setText(mBinding.content, R.string.detail_content, Html.fromHtml(item.getVodContent()).toString()); setText(mBinding.director, R.string.detail_director, Html.fromHtml(item.getVodDirector()).toString()); @@ -429,7 +439,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onScale() { int index = mHistory.getScale(); if (index == -1) index = Prefers.getVodScale(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_scale); + String[] array = ResUtil.getStringArray(R.array.select_scale); mHistory.setScale(index = index == array.length - 1 ? 0 : ++index); setScale(index); } @@ -474,16 +484,20 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onPlayer() { + mPlayers.stop(); + mPlayers.togglePlayer(); + mHistory.setPlayer(mPlayers.getPlayer()); mBinding.control.tracks.setVisibility(View.GONE); - mBinding.control.player.setText(mPlayers.togglePlayer()); - App.post(() -> getPlayer(false), 250); + getPlayer(false); setPlayerView(); } private void onDecode() { - mBinding.control.decode.setText(mPlayers.toggleDecode()); - if (mPlayers.isExo()) getExo().setPlayer(mPlayers.exo()); + mPlayers.toggleDecode(); + mPlayers.setupIjk(getIjk()); + mPlayers.setupExo(getExo()); getPlayer(false); + setDecodeView(); } private void onTracks() { @@ -579,6 +593,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.control.opening.setText(mPlayers.stringToTime(mHistory.getOpening())); mBinding.control.ending.setText(mPlayers.stringToTime(mHistory.getEnding())); mBinding.control.speed.setText(mPlayers.setSpeed(mHistory.getSpeed())); + mPlayers.setPlayer(getPlayerType()); + setPlayerView(); + setDecodeView(); } private History createHistory() { @@ -609,7 +626,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis Keep keep = new Keep(); keep.setKey(getHistoryKey()); keep.setCid(ApiConfig.getCid()); - keep.setSiteName(ApiConfig.getSiteName(getKey())); + keep.setSiteName(getSite().getName()); keep.setVodPic(mBinding.video.getTag().toString()); keep.setVodName(mBinding.name.getText().toString()); keep.setCreateTime(System.currentTimeMillis()); 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 308649fd6..d196bb79b 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 @@ -126,7 +126,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick mFormatTime = new SimpleDateFormat("yyyy-MM-ddHH:mm", Locale.getDefault()); mHides = new ArrayList<>(); setRecyclerView(); - setPlayerView(); setVideoView(); setViewModel(); getLive(); @@ -161,26 +160,34 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void setPlayerView() { + mBinding.control.player.setText(mPlayers.getPlayerText()); getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE); getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE); } + private void setDecodeView() { + mBinding.control.decode.setText(mPlayers.getDecodeText()); + } + private void setVideoView() { mPlayers.setupIjk(getIjk()); - getExo().setPlayer(mPlayers.exo()); - getExo().setResizeMode(Prefers.getLiveScale()); - getExo().setOnClickListener(view -> onToggle()); - getExo().setOnLongClickListener(view -> onLongPress()); - getIjk().setResizeMode(Prefers.getLiveScale()); + mPlayers.setupExo(getExo()); + setScale(Prefers.getLiveScale()); getIjk().setRender(Prefers.getRender()); - getIjk().setDecode(Prefers.getDecode()); + getExo().setOnClickListener(view -> onToggle()); getIjk().setOnClickListener(view -> onToggle()); + getExo().setOnLongClickListener(view -> onLongPress()); getIjk().setOnLongClickListener(view -> onLongPress()); mBinding.control.speed.setText(mPlayers.getSpeedText()); mBinding.control.home.setVisibility(LiveConfig.isOnly() ? View.GONE : View.VISIBLE); - mBinding.control.player.setText(ResUtil.getStringArray(R.array.select_player)[Prefers.getPlayer()]); - mBinding.control.decode.setText(ResUtil.getStringArray(R.array.select_decode)[Prefers.getDecode()]); - mBinding.control.scale.setText(ResUtil.getStringArray(R.array.select_scale)[Prefers.getLiveScale()]); + setPlayerView(); + setDecodeView(); + } + + private void setScale(int scale) { + getExo().setResizeMode(scale); + getIjk().setResizeMode(scale); + mBinding.control.scale.setText(ResUtil.getStringArray(R.array.select_scale)[scale]); } private void setViewModel() { @@ -256,11 +263,9 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick private void onScale() { int index = Prefers.getLiveScale(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_scale); + String[] array = ResUtil.getStringArray(R.array.select_scale); Prefers.putLiveScale(index = index == array.length - 1 ? 0 : ++index); - mBinding.control.scale.setText(array[index]); - getExo().setResizeMode(index); - getIjk().setResizeMode(index); + setScale(index); } private void onSpeed() { @@ -273,15 +278,18 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick } private void onPlayer() { + mPlayers.stop(); + mPlayers.togglePlayer(); mBinding.control.tracks.setVisibility(View.GONE); - mBinding.control.player.setText(mPlayers.togglePlayer()); - App.post(this::getUrl, 250); setPlayerView(); + getUrl(); } private void onDecode() { - mBinding.control.decode.setText(mPlayers.toggleDecode()); - if (mPlayers.isExo()) getExo().setPlayer(mPlayers.exo()); + mPlayers.toggleDecode(); + mPlayers.setupIjk(getIjk()); + mPlayers.setupExo(getExo()); + setDecodeView(); getUrl(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 4ec1b62a7..05737b6f6 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -180,7 +180,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit private void setQuality() { int index = Prefers.getQuality(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_quality); + String[] array = ResUtil.getStringArray(R.array.select_quality); Prefers.putQuality(index = index == array.length - 1 ? 0 : ++index); mBinding.qualityText.setText(array[index]); RefreshEvent.image(); @@ -188,35 +188,35 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit private void setPlayer() { int index = Prefers.getPlayer(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_player); + String[] array = ResUtil.getStringArray(R.array.select_player); Prefers.putPlayer(index = index == array.length - 1 ? 0 : ++index); mBinding.playerText.setText(array[index]); } private void setDecode() { int index = Prefers.getDecode(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_decode); + String[] array = ResUtil.getStringArray(R.array.select_decode); Prefers.putDecode(index = index == array.length - 1 ? 0 : ++index); mBinding.decodeText.setText(array[index]); } private void setRender() { int index = Prefers.getRender(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_render); + String[] array = ResUtil.getStringArray(R.array.select_render); Prefers.putRender(index = index == array.length - 1 ? 0 : ++index); mBinding.renderText.setText(array[index]); } private void setScale() { int index = Prefers.getVodScale(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_scale); + String[] array = ResUtil.getStringArray(R.array.select_scale); Prefers.putVodScale(index = index == array.length - 1 ? 0 : ++index); mBinding.scaleText.setText(array[index]); } private void setSize() { int index = Prefers.getSize(); - CharSequence[] array = ResUtil.getStringArray(R.array.select_size); + String[] array = ResUtil.getStringArray(R.array.select_size); Prefers.putSize(index = index == array.length - 1 ? 0 : ++index); mBinding.sizeText.setText(array[index]); RefreshEvent.size(); diff --git a/app/src/main/java/com/fongmi/android/tv/bean/Site.java b/app/src/main/java/com/fongmi/android/tv/bean/Site.java index d56853678..a1017947b 100644 --- a/app/src/main/java/com/fongmi/android/tv/bean/Site.java +++ b/app/src/main/java/com/fongmi/android/tv/bean/Site.java @@ -102,10 +102,6 @@ public class Site { return playUrl; } - public Integer getPlayerType() { - return playerType; - } - public Integer getSearchable() { return searchable; } @@ -180,6 +176,12 @@ public class Site { return isFilterable() ? R.drawable.ic_filter_on : R.drawable.ic_filter_off; } + public int getPlayerType() { + if (playerType == null) return -1; + if (playerType == 1) return 1; + return 0; + } + public static Site find(String key) { return AppDatabase.get().getSiteDao().find(key); } diff --git a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java index 3de0ab6e1..f89be88a4 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java +++ b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java @@ -87,7 +87,6 @@ public abstract class AppDatabase extends RoomDatabase { public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE History ADD COLUMN speed REAL DEFAULT 1 NOT NULL"); database.execSQL("ALTER TABLE History ADD COLUMN player INTEGER DEFAULT -1 NOT NULL"); - database.execSQL("ALTER TABLE History ADD COLUMN decode INTEGER DEFAULT -1 NOT NULL"); } }; } 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 9a9384293..83d3a3ca9 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,7 +7,6 @@ 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; @@ -51,8 +50,8 @@ public class ExoUtil { return trackSelector; } - public static RenderersFactory buildRenderersFactory() { - return new DefaultRenderersFactory(App.get()).setExtensionRendererMode(Math.abs(Prefers.getDecode() - 2)); + public static RenderersFactory buildRenderersFactory(int decode) { + return new DefaultRenderersFactory(App.get()).setExtensionRendererMode(Math.abs(decode - 2)); } public static CaptionStyleCompat getCaptionStyle() { 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 1a83a7dfb..7beb231a1 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 @@ -16,6 +16,7 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackException; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.analytics.AnalyticsListener; +import com.google.android.exoplayer2.ui.StyledPlayerView; import com.google.android.exoplayer2.util.Util; import java.util.Formatter; @@ -34,42 +35,55 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM private ExoPlayer exoPlayer; private int errorCode; private int retry; + private int decode; + private int player; public boolean isExo() { - return Prefers.isExo(); + return player == 0; } public boolean isIjk() { - return Prefers.isIjk(); + return player == 1; } public Players init() { + player = Prefers.getPlayer(); + decode = Prefers.getDecode(); builder = new StringBuilder(); formatter = new Formatter(builder, Locale.getDefault()); - setupExo(); return this; } public void setupIjk(IjkVideoView view) { ijkPlayer = view; + ijkPlayer.setDecode(decode); ijkPlayer.setOnInfoListener(this); ijkPlayer.setOnErrorListener(this); ijkPlayer.setOnPreparedListener(this); ijkPlayer.setOnCompletionListener(this); } - public void setupExo() { + public void setupExo(StyledPlayerView view) { if (exoPlayer != null) releaseExo(); - exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(ExoUtil.buildRenderersFactory()).setTrackSelector(ExoUtil.buildTrackSelector()).build(); + exoPlayer = new ExoPlayer.Builder(App.get()).setLoadControl(new DefaultLoadControl()).setRenderersFactory(ExoUtil.buildRenderersFactory(decode)).setTrackSelector(ExoUtil.buildTrackSelector()).build(); exoPlayer.addAnalyticsListener(this); exoPlayer.setPlayWhenReady(true); exoPlayer.addListener(this); + view.setPlayer(exoPlayer); } public ExoPlayer exo() { return exoPlayer; } + public int getPlayer() { + return player; + } + + public int getDecode() { + return decode; + } + public void reset() { this.errorCode = 0; this.retry = 0; @@ -124,6 +138,14 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM return String.format(Locale.getDefault(), "%.2f", getSpeed()); } + public String getPlayerText() { + return ResUtil.getStringArray(R.array.select_player)[player]; + } + + public String getDecodeText() { + return ResUtil.getStringArray(R.array.select_decode)[decode]; + } + public String setSpeed(float speed) { exoPlayer.setPlaybackSpeed(speed); ijkPlayer.setSpeed(speed); @@ -147,17 +169,22 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM return getSpeedText(); } - public String togglePlayer() { - stop(); - int index = Prefers.getPlayer(); - Prefers.putPlayer(index = index == 0 ? 1 : 0); - return ResUtil.getStringArray(R.array.select_player)[index].toString(); + public void setPlayer(int player) { + this.player = player; + Prefers.putPlayer(player); + } + + public void togglePlayer() { + setPlayer(player == 0 ? 1 : 0); + } + + public void setDecode(int decode) { + this.decode = decode; + Prefers.putDecode(decode); } - public String toggleDecode() { - int index = Prefers.getDecode(); - setDecode(index = index == 0 ? 1 : 0); - return ResUtil.getStringArray(R.array.select_decode)[index].toString(); + public void toggleDecode() { + setDecode(decode == 0 ? 1 : 0); } public String getPositionTime(long time) { @@ -173,12 +200,6 @@ public class Players implements Player.Listener, IMediaPlayer.OnInfoListener, IM return stringToTime(time); } - public void setDecode(int decode) { - Prefers.putDecode(decode); - ijkPlayer.setDecode(decode); - if (isExo()) setupExo(); - } - public void seekTo(int time) { if (time == 0) return; if (isExo()) exoPlayer.seekTo(getPosition() + time); 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 ab15a0ce2..c9243b95f 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 @@ -154,12 +154,4 @@ public class Prefers { public static int getColumn() { return Math.abs(getSize() - 7); } - - public static boolean isExo() { - return getPlayer() == 0; - } - - public static boolean isIjk() { - return getPlayer() == 1; - } } diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java index 27c09ae66..f6b484901 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java @@ -52,7 +52,7 @@ public class ResUtil { return App.get().getString(resId, formatArgs); } - public static CharSequence[] getStringArray(@ArrayRes int resId) { + public static String[] getStringArray(@ArrayRes int resId) { return App.get().getResources().getStringArray(resId); }