diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 52d218029..92cb5d336 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -49,6 +49,7 @@ import com.fongmi.android.tv.ui.custom.CustomKeyDownVod; import com.fongmi.android.tv.ui.custom.Pip; import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; import com.fongmi.android.tv.ui.custom.ViewType; +import com.fongmi.android.tv.ui.custom.dialog.ControlDialog; import com.fongmi.android.tv.ui.custom.dialog.EpisodeDialog; import com.fongmi.android.tv.ui.custom.dialog.TrackDialog; import com.fongmi.android.tv.utils.Clock; @@ -72,19 +73,18 @@ import java.util.concurrent.Executors; import tv.danmaku.ijk.media.player.ui.IjkVideoView; -public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, TrackDialog.Listener, Clock.Callback, FlagAdapter.OnClickListener, EpisodeAdapter.OnClickListener, ParseAdapter.OnClickListener { +public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, TrackDialog.Listener, ControlDialog.Listener, Clock.Callback, FlagAdapter.OnClickListener, EpisodeAdapter.OnClickListener, ParseAdapter.OnClickListener { private ViewGroup.LayoutParams mFrameParams; private ActivityDetailBinding mBinding; private EpisodeAdapter mEpisodeAdapter; private SearchAdapter mSearchAdapter; - private EpisodeDialog mEpisodeDialog; + private ControlDialog mControlDialog; private ParseAdapter mParseAdapter; private CustomKeyDownVod mKeyDown; private ExecutorService mExecutor; private SiteViewModel mViewModel; private FlagAdapter mFlagAdapter; - private TrackDialog mTrackDialog; private PipReceiver mReceiver; private History mHistory; private Players mPlayers; @@ -255,6 +255,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.control.action.player.setText(mPlayers.getPlayerText()); getExo().setVisibility(mPlayers.isExo() ? View.VISIBLE : View.GONE); getIjk().setVisibility(mPlayers.isIjk() ? View.VISIBLE : View.GONE); + mBinding.video.addOnLayoutChangeListener((view, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> mPip.update(getActivity(), view)); } private void setDecodeView() { @@ -291,7 +292,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis }); mViewModel.episode.observe(this, episode -> { onItemClick(episode); - hideEpisode(); + hideSheet(); }); } @@ -412,8 +413,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis private void onMore() { for (Fragment fragment : getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; - mEpisodeDialog = EpisodeDialog.create().reverse(mHistory.isRevSort()).episodes(mEpisodeAdapter.getItems()); - mEpisodeDialog.show(getSupportFragmentManager(), null); + EpisodeDialog.create().reverse(mHistory.isRevSort()).episodes(mEpisodeAdapter.getItems()).show(getSupportFragmentManager(), null); } private void onContent() { @@ -490,14 +490,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis } private void onSetting() { - mBinding.control.action.getRoot().setVisibility(View.VISIBLE); - setR1Callback(); + for (Fragment fragment : getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; + mControlDialog = ControlDialog.create(this).detail(mBinding).players(mPlayers); + mControlDialog.show(getSupportFragmentManager(), null); } private void onTrack(View view) { for (Fragment fragment : getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) return; - mTrackDialog = TrackDialog.create().player(mPlayers).type(Integer.parseInt(view.getTag().toString())).listener(this); - mTrackDialog.show(getSupportFragmentManager(), null); + TrackDialog.create().player(mPlayers).type(Integer.parseInt(view.getTag().toString())).listener(this).show(getSupportFragmentManager(), null); hideControl(); } @@ -669,14 +669,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis App.removeCallbacks(mR1); } - private void hideTrack() { - if (mTrackDialog != null) mTrackDialog.dismissAllowingStateLoss(); - mTrackDialog = null; - } - - private void hideEpisode() { - if (mEpisodeDialog != null) mEpisodeDialog.dismissAllowingStateLoss(); - mEpisodeDialog = null; + private void hideSheet() { + for (Fragment fragment : getSupportFragmentManager().getFragments()) if (fragment instanceof BottomSheetDialogFragment) ((BottomSheetDialogFragment) fragment).dismiss(); } private void setTraffic() { @@ -818,6 +812,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mBinding.control.action.text.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_TEXT) ? View.VISIBLE : View.GONE); mBinding.control.action.audio.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_AUDIO) ? View.VISIBLE : View.GONE); mBinding.control.action.video.setVisibility(visible && mPlayers.haveTrack(C.TRACK_TYPE_VIDEO) ? View.VISIBLE : View.GONE); + if (mControlDialog != null && mControlDialog.isVisible()) mControlDialog.setTrackVisible(); } private void setDefaultTrack() { @@ -1010,6 +1005,12 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis adapter.notifyItemRangeChanged(0, adapter.getItemCount()); } + @Override + public void onScale(int tag) { + mHistory.setScale(tag); + setScale(tag); + } + @Override public void onSpeedUp() { mBinding.control.action.speed.setText(mPlayers.setSpeed(mPlayers.getSpeed() < 3 ? 3 : 5)); @@ -1101,8 +1102,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis mReceiver.register(this); enterFullscreen(); hideControl(); - hideEpisode(); - hideTrack(); + hideSheet(); } else { exitFullscreen(); mReceiver.unregister(this); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java index 8aba70098..9c61fef30 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/SiteAdapter.java @@ -66,7 +66,6 @@ public class SiteAdapter extends RecyclerView.Adapter { holder.binding.text.setEnabled(!search || change); holder.binding.text.setFocusable(!search || change); holder.binding.text.setActivated(item.isActivated()); - holder.binding.search.setActivated(item.isActivated()); holder.binding.search.setImageResource(item.getSearchIcon()); holder.binding.change.setImageResource(item.getChangeIcon()); holder.binding.search.setVisibility(search ? View.VISIBLE : View.GONE); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java index 04c136586..38147891e 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java @@ -5,8 +5,11 @@ import android.app.PendingIntent; import android.app.PictureInPictureParams; import android.app.RemoteAction; import android.content.Intent; +import android.graphics.Rect; import android.graphics.drawable.Icon; +import android.os.Build; import android.util.Rational; +import android.view.View; import com.fongmi.android.tv.utils.Utils; @@ -29,20 +32,29 @@ public class Pip { this.builder = new PictureInPictureParams.Builder(); } + public void update(Activity activity, View view) { + if (!Utils.hasPIP()) return; + Rect sourceRectHint = new Rect(); + view.getGlobalVisibleRect(sourceRectHint); + builder.setSourceRectHint(sourceRectHint); + activity.setPictureInPictureParams(builder.build()); + } + public void update(Activity activity, boolean play) { if (!Utils.hasPIP()) return; List actions = new ArrayList<>(); actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_previous), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PREV, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PREV), 0))); actions.add(new RemoteAction(Icon.createWithResource(activity, play ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_PLAY, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_PLAY), 0))); actions.add(new RemoteAction(Icon.createWithResource(activity, com.google.android.exoplayer2.ui.R.drawable.exo_icon_next), "", "", PendingIntent.getBroadcast(activity, CONTROL_TYPE_NEXT, new Intent(ACTION_MEDIA_CONTROL).putExtra(EXTRA_CONTROL_TYPE, CONTROL_TYPE_NEXT), 0))); - builder.setActions(actions); - activity.setPictureInPictureParams(builder.build()); + activity.setPictureInPictureParams(builder.setActions(actions).build()); } public void enter(Activity activity, boolean four) { try { if (!Utils.hasPIP() || activity.isInPictureInPictureMode()) return; - builder.setAspectRatio(new Rational(four ? 4 : 16, four ? 3 : 9)).build(); + builder.setAspectRatio(new Rational(four ? 4 : 16, four ? 3 : 9)); + 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/mobile/res/drawable-nodpi/ic_logo.png b/app/src/mobile/res/drawable-nodpi/ic_logo.png index 3cc33b026..a32959a6b 100644 Binary files a/app/src/mobile/res/drawable-nodpi/ic_logo.png and b/app/src/mobile/res/drawable-nodpi/ic_logo.png differ diff --git a/app/src/mobile/res/drawable/shape_accent_normal.xml b/app/src/mobile/res/drawable/shape_accent_normal.xml index 1812dbc97..8079f0563 100644 --- a/app/src/mobile/res/drawable/shape_accent_normal.xml +++ b/app/src/mobile/res/drawable/shape_accent_normal.xml @@ -2,7 +2,7 @@ - + diff --git a/app/src/mobile/res/values/styles.xml b/app/src/mobile/res/values/styles.xml index 6ae3243f5..7f96009b4 100644 --- a/app/src/mobile/res/values/styles.xml +++ b/app/src/mobile/res/values/styles.xml @@ -25,6 +25,7 @@ wrap_content wrap_content ?attr/selectableItemBackgroundBorderless + 4dp 16dp @color/grey_200 1