From f233694fb367266220ec7fdca3eca4dc0183169b Mon Sep 17 00:00:00 2001 From: FongMi Date: Mon, 20 Feb 2023 18:28:21 +0800 Subject: [PATCH] [mobile] support lock and full button --- .../tv/ui/activity/DetailActivity.java | 2 +- .../com/fongmi/android/tv/utils/Utils.java | 8 +- app/src/main/res/layout/view_control_seek.xml | 2 +- .../tv/ui/activity/DetailActivity.java | 173 ++++++++++++------ app/src/mobile/res/drawable/ic_full_off.xml | 10 + app/src/mobile/res/drawable/ic_full_on.xml | 10 + app/src/mobile/res/drawable/ic_lock_off.xml | 10 + app/src/mobile/res/drawable/ic_lock_on.xml | 10 + app/src/mobile/res/layout/activity_detail.xml | 4 +- .../mobile/res/layout/view_control_vod.xml | 44 ++++- 10 files changed, 201 insertions(+), 72 deletions(-) create mode 100644 app/src/mobile/res/drawable/ic_full_off.xml create mode 100644 app/src/mobile/res/drawable/ic_full_on.xml create mode 100644 app/src/mobile/res/drawable/ic_lock_off.xml create mode 100644 app/src/mobile/res/drawable/ic_lock_on.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 821dc7c0f..6b30bf68f 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 @@ -292,7 +292,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); mViewModel.search.observe(this, result -> setSearch(result.getList())); mViewModel.player.observe(this, result -> { - boolean useParse = (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1; + boolean useParse = result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag()) || result.getJx() == 1; mBinding.control.parseLayout.setVisibility(mParseAdapter.size() > 0 && useParse ? View.VISIBLE : View.GONE); int timeout = getSite().isChangeable() ? Constant.TIMEOUT_PLAY : -1; mPlayers.start(result, useParse, timeout); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java index b7d0c0aa5..304dd2de8 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Utils.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Utils.java @@ -5,6 +5,7 @@ import android.app.Activity; import android.app.PictureInPictureParams; import android.content.Context; import android.content.pm.PackageManager; +import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.IBinder; @@ -82,11 +83,14 @@ public class Utils { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && App.get().getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); } - public static void enterPIP(Activity activity) { + public static void enterPIP(Activity activity, Rect sourceRectHint, Rational rational) { try { if (!hasPIP() || activity.isInPictureInPictureMode()) return; PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder(); - builder.setAspectRatio(new Rational(16, 9)).build(); + builder.setAspectRatio(rational).build(); + builder.setSourceRectHint(sourceRectHint); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setAutoEnterEnabled(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) builder.setSeamlessResizeEnabled(true); activity.enterPictureInPictureMode(builder.build()); } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/res/layout/view_control_seek.xml b/app/src/main/res/layout/view_control_seek.xml index bff20a051..930398120 100644 --- a/app/src/main/res/layout/view_control_seek.xml +++ b/app/src/main/res/layout/view_control_seek.xml @@ -18,7 +18,7 @@ onMore()); - mBinding.video.setOnClickListener(view -> onVideo()); mBinding.control.text.setOnClickListener(this::onTrack); mBinding.control.audio.setOnClickListener(this::onTrack); mBinding.control.video.setOnClickListener(this::onTrack); + mBinding.control.lock.setOnClickListener(view -> onLock()); + mBinding.control.full.setOnClickListener(view -> onFull()); mBinding.control.next.setOnClickListener(view -> checkNext()); mBinding.control.prev.setOnClickListener(view -> checkPrev()); mBinding.control.scale.setOnClickListener(view -> onScale()); @@ -254,10 +263,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mViewModel = new ViewModelProvider(this).get(SiteViewModel.class); //mViewModel.search.observe(this, result -> setSearch(result.getList())); mViewModel.player.observe(this, result -> { - boolean useParse = (result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag())) || result.getJx() == 1; - mBinding.control.parseLayout.setVisibility(mParseAdapter.getItemCount() > 0 && useParse ? View.VISIBLE : View.GONE); + setUseParse(result.getPlayUrl().isEmpty() && ApiConfig.get().getFlags().contains(result.getFlag()) || result.getJx() == 1); + mBinding.control.parseLayout.setVisibility(mParseAdapter.getItemCount() > 0 && isUseParse() ? View.VISIBLE : View.GONE); int timeout = getSite().isChangeable() ? Constant.TIMEOUT_PLAY : -1; - mPlayers.start(result, useParse, timeout); + mPlayers.start(result, isUseParse(), timeout); }); mViewModel.result.observe(this, result -> { if (result.getList().isEmpty()) setEmpty(); @@ -378,16 +387,39 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis setEpisodeAdapter(getFlag().getEpisodes()); } - private void onVideo() { - if (!isFullscreen()) enterFullscreen(); + private void onMore() { + boolean more = getString(R.string.vod_content_expand).equals(mBinding.more.getText().toString()); + mBinding.more.setText(more ? R.string.vod_content_collapse : R.string.vod_content_expand); + mBinding.content.setMaxLines(more ? Integer.MAX_VALUE : 4); + } + + private void onTrack(View view) { + int type = Integer.parseInt(view.getTag().toString()); + //TrackDialog.create(this).player(mPlayers).type(type).listener(this).show(); + setR1Callback(); + hideControl(); + } + + private void onLock() { + setR1Callback(); + setLock(!isLock()); + mBinding.control.lock.setImageResource(isLock() ? R.drawable.ic_lock_on : R.drawable.ic_lock_off); + setRequestedOrientation(isLock() ? (ResUtil.isLand() ? ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE : ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT) : ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); + } + + private void onFull() { + setR1Callback(); + toggleFullscreen(); } private void checkNext() { + setR1Callback(); if (mHistory.isRevPlay()) onPrev(); else onNext(); } private void checkPrev() { + setR1Callback(); if (mHistory.isRevPlay()) onNext(); else onPrev(); } @@ -405,14 +437,15 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onScale() { - int index = mHistory.getScale(); - if (index == -1) index = Prefers.getScale(); + int index = getScale(); String[] array = ResUtil.getStringArray(R.array.select_scale); mHistory.setScale(index = index == array.length - 1 ? 0 : ++index); setScale(index); + setR1Callback(); } private void onSpeed() { + setR1Callback(); mBinding.control.speed.setText(mPlayers.addSpeed()); mHistory.setSpeed(mPlayers.getSpeed()); } @@ -420,6 +453,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private boolean onSpeedLong() { mBinding.control.speed.setText(mPlayers.toggleSpeed()); mHistory.setSpeed(mPlayers.getSpeed()); + setR1Callback(); return true; } @@ -431,6 +465,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onReset() { + setR1Callback(); Clock.get().setCallback(null); if (mFlagAdapter.getItemCount() == 0) return; if (mEpisodeAdapter.getItemCount() == 0) return; @@ -440,21 +475,25 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private boolean onResetToggle() { Prefers.putReset(Math.abs(Prefers.getReset() - 1)); mBinding.control.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Prefers.getReset()]); + setR1Callback(); return true; } - private void onOpening() { - long current = mPlayers.getPosition(); - long duration = mPlayers.getDuration(); - if (current < 0 || current > duration / 2) return; - mHistory.setOpening(current); - mBinding.control.opening.setText(mPlayers.stringToTime(mHistory.getOpening())); + private void onPlayer() { + mPlayers.togglePlayer(); + Prefers.putPlayer(mPlayers.getPlayer()); + mHistory.setPlayer(mPlayers.getPlayer()); + setPlayerView(); + setR1Callback(); + onRefresh(); } - private boolean onOpeningReset() { - mHistory.setOpening(0); - mBinding.control.opening.setText(mPlayers.stringToTime(mHistory.getOpening())); - return true; + private void onDecode() { + mPlayers.toggleDecode(); + mPlayers.set(getExo(), getIjk()); + setDecodeView(); + setR1Callback(); + onRefresh(); } private void onEnding() { @@ -463,44 +502,52 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis if (current < 0 || current < duration / 2) return; mHistory.setEnding(duration - current); mBinding.control.ending.setText(mPlayers.stringToTime(mHistory.getEnding())); + setR1Callback(); } private boolean onEndingReset() { mHistory.setEnding(0); mBinding.control.ending.setText(mPlayers.stringToTime(mHistory.getEnding())); + setR1Callback(); return true; } - private void onPlayer() { - mPlayers.togglePlayer(); - Prefers.putPlayer(mPlayers.getPlayer()); - mHistory.setPlayer(mPlayers.getPlayer()); - setPlayerView(); - onRefresh(); + private void onOpening() { + long current = mPlayers.getPosition(); + long duration = mPlayers.getDuration(); + if (current < 0 || current > duration / 2) return; + mHistory.setOpening(current); + mBinding.control.opening.setText(mPlayers.stringToTime(mHistory.getOpening())); + setR1Callback(); } - private void onDecode() { - mPlayers.toggleDecode(); - mPlayers.set(getExo(), getIjk()); - setDecodeView(); - onRefresh(); + private boolean onOpeningReset() { + mHistory.setOpening(0); + mBinding.control.opening.setText(mPlayers.stringToTime(mHistory.getOpening())); + setR1Callback(); + return true; } - private void onTrack(View view) { - int type = Integer.parseInt(view.getTag().toString()); - //TrackDialog.create(this).player(mPlayers).type(type).listener(this).show(); - hideControl(); + private void toggleFullscreen() { + if (isFullscreen()) exitFullscreen(); + else enterFullscreen(); } private void enterFullscreen() { + mBinding.control.full.setImageResource(R.drawable.ic_full_off); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 16); mBinding.video.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); + App.post(mR3, 3000); setFullscreen(true); + hideControl(); + hideInfo(); } private void exitFullscreen() { + mBinding.control.full.setImageResource(R.drawable.ic_full_on); + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); getIjk().getSubtitleView().setTextSize(TypedValue.COMPLEX_UNIT_SP, 14); - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); mBinding.video.setLayoutParams(mFrameParams); App.post(mR3, 3000); setFullscreen(false); @@ -508,12 +555,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis hideInfo(); } - private void onMore() { - boolean more = getString(R.string.vod_content_expand).equals(mBinding.more.getText().toString()); - mBinding.more.setText(more ? R.string.vod_content_collapse : R.string.vod_content_expand); - mBinding.content.setMaxLines(more ? Integer.MAX_VALUE : 4); - } - private void showProgress() { mBinding.widget.progress.setVisibility(View.VISIBLE); App.post(mR2, 0); @@ -546,9 +587,10 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.widget.info.setVisibility(View.GONE); } - private void showControl(View view) { + private void showControl() { + mBinding.control.parseLayout.setVisibility(isFullscreen() && isUseParse() ? View.VISIBLE : View.GONE); + mBinding.control.actionLayout.setVisibility(isFullscreen() ? View.VISIBLE : View.GONE); mBinding.control.getRoot().setVisibility(View.VISIBLE); - view.requestFocus(); setR1Callback(); } @@ -568,7 +610,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void setSensor() { - setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); + if (!isLock()) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); } private void setR1Callback() { @@ -586,11 +628,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mHistory = mHistory == null ? createHistory(item) : mHistory; onItemClick(mHistory.getFlag()); if (mHistory.isRevSort()) reverseEpisode(); - setScale(mHistory.getScale() == -1 ? Prefers.getScale() : mHistory.getScale()); 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()); + mPlayers.setPlayer(getPlayer()); + setScale(getScale()); setPlayerView(); setDecodeView(); } @@ -697,7 +739,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis showError(event.getMsg()); mPlayers.stop(); hideProgress(); - //statFlow(); + //startFlow(); } private void onPause(boolean visible) { @@ -745,16 +787,30 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis this.mAutoMode = autoMode; } + public boolean isUseParse() { + return mUseParse; + } + + public void setUseParse(boolean useParse) { + this.mUseParse = useParse; + } + + public boolean isLock() { + return mLock; + } + + public void setLock(boolean lock) { + this.mLock = lock; + } + private void notifyItemChanged(RecyclerView.Adapter adapter) { adapter.notifyItemRangeChanged(0, adapter.getItemCount()); } @Override public void onSingleTap() { - if (isFullscreen()) { - if (isVisible(mBinding.control.getRoot())) hideControl(); - else showControl(mBinding.control.next); - } + if (isVisible(mBinding.control.getRoot())) hideControl(); + else showControl(); } @Override @@ -769,6 +825,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { super.onConfigurationChanged(newConfig); + if (isLock()) return; if (ResUtil.isLand()) enterFullscreen(); if (ResUtil.isPort()) exitFullscreen(); } @@ -776,7 +833,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void onUserLeaveHint() { super.onUserLeaveHint(); - Utils.enterPIP(this); + Rect sourceRectHint = new Rect(); + mBinding.video.getGlobalVisibleRect(sourceRectHint); + Utils.enterPIP(this, sourceRectHint, getScale() == 2 ? new Rational(4, 3) : new Rational(16, 9)); } @Override @@ -831,6 +890,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis protected void onDestroy() { super.onDestroy(); mPlayers.release(); - App.removeCallbacks(mR1, mR2); + App.removeCallbacks(mR1, mR2, mR3); } } diff --git a/app/src/mobile/res/drawable/ic_full_off.xml b/app/src/mobile/res/drawable/ic_full_off.xml new file mode 100644 index 000000000..0400cb942 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_full_off.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_full_on.xml b/app/src/mobile/res/drawable/ic_full_on.xml new file mode 100644 index 000000000..1d5bd17dd --- /dev/null +++ b/app/src/mobile/res/drawable/ic_full_on.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_lock_off.xml b/app/src/mobile/res/drawable/ic_lock_off.xml new file mode 100644 index 000000000..e8664e261 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_lock_off.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/drawable/ic_lock_on.xml b/app/src/mobile/res/drawable/ic_lock_on.xml new file mode 100644 index 000000000..623ab1304 --- /dev/null +++ b/app/src/mobile/res/drawable/ic_lock_on.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/mobile/res/layout/activity_detail.xml b/app/src/mobile/res/layout/activity_detail.xml index f27f648dd..f5ab68b8b 100644 --- a/app/src/mobile/res/layout/activity_detail.xml +++ b/app/src/mobile/res/layout/activity_detail.xml @@ -10,7 +10,9 @@ android:id="@+id/video" android:layout_width="match_parent" android:layout_height="232dp" - android:background="@color/black"> + android:background="@color/black" + android:clickable="true" + android:focusable="true"> + android:paddingBottom="4dp"> - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + + \ No newline at end of file