[mobile] support lock and full button

pull/123/head
FongMi 3 years ago
parent 3749ee81f4
commit f233694fb3
  1. 2
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 8
      app/src/main/java/com/fongmi/android/tv/utils/Utils.java
  3. 2
      app/src/main/res/layout/view_control_seek.xml
  4. 173
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  5. 10
      app/src/mobile/res/drawable/ic_full_off.xml
  6. 10
      app/src/mobile/res/drawable/ic_full_on.xml
  7. 10
      app/src/mobile/res/drawable/ic_lock_off.xml
  8. 10
      app/src/mobile/res/drawable/ic_lock_on.xml
  9. 4
      app/src/mobile/res/layout/activity_detail.xml
  10. 44
      app/src/mobile/res/layout/view_control_vod.xml

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

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

@ -18,7 +18,7 @@
<com.google.android.exoplayer2.ui.DefaultTimeBar
android:id="@+id/timeBar"
android:layout_width="0dp"
android:layout_height="26dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"

@ -5,8 +5,10 @@ import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.text.Html;
import android.text.Layout;
import android.util.Rational;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
@ -63,20 +65,22 @@ import tv.danmaku.ijk.media.player.ui.IjkVideoView;
public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Listener, FlagAdapter.OnClickListener, EpisodeAdapter.OnClickListener, ParseAdapter.OnClickListener, Clock.Callback {
private ActivityDetailBinding mBinding;
private ViewGroup.LayoutParams mFrameParams;
private ActivityDetailBinding mBinding;
private EpisodeAdapter mEpisodeAdapter;
private ParseAdapter mParseAdapter;
private FlagAdapter mFlagAdapter;
private CustomKeyDownVod mKeyDown;
private ExecutorService mExecutor;
private SiteViewModel mViewModel;
private FlagAdapter mFlagAdapter;
private History mHistory;
private Players mPlayers;
private boolean mFullscreen;
private boolean mInitTrack;
private boolean mInitAuto;
private boolean mAutoMode;
private History mHistory;
private Players mPlayers;
private boolean mUseParse;
private boolean mLock;
private int mCurrent;
private Runnable mR1;
private Runnable mR2;
@ -131,10 +135,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
return mEpisodeAdapter.getActivated();
}
private int getPlayerType() {
private int getPlayer() {
return mHistory != null && mHistory.getPlayer() != -1 ? mHistory.getPlayer() : getSite().getPlayerType() != -1 ? getSite().getPlayerType() : Prefers.getPlayer();
}
private int getScale() {
return mHistory != null && mHistory.getScale() != -1 ? mHistory.getScale() : Prefers.getScale();
}
private StyledPlayerView getExo() {
return Prefers.getRender() == 0 ? mBinding.surface : mBinding.texture;
}
@ -186,10 +194,11 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
protected void initEvent() {
mBinding.control.seek.setListener(mPlayers);
mBinding.more.setOnClickListener(view -> 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);
}
}

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_700"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M5,16h3v3h2v-5L5,14v2zM8,8L5,8v2h5L10,5L8,5v3zM14,19h2v-3h3v-2h-5v5zM16,8L16,5h-2v5h5L19,8h-3z" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_700"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M7,14L5,14v5h5v-2L7,17v-3zM5,10h2L7,7h3L10,5L5,5v5zM17,17h-3v2h5v-5h-2v3zM14,5v2h3v3h2L19,5h-5z" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_700"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6h2c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM18,20L6,20L6,10h12v10zM12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z" />
</vector>

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="@color/grey_700"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M18,8h-1L17,6c0,-2.76 -2.24,-5 -5,-5S7,3.24 7,6v2L6,8c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,10c0,-1.1 -0.9,-2 -2,-2zM9,6c0,-1.66 1.34,-3 3,-3s3,1.34 3,3v2L9,8L9,6zM18,20L6,20L6,10h12v10zM12,17c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2z" />
</vector>

@ -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">
<com.google.android.exoplayer2.ui.StyledPlayerView
android:id="@+id/surface"

@ -7,18 +7,20 @@
android:background="@drawable/shape_controller"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingTop="16dp"
android:paddingTop="4dp"
android:paddingEnd="16dp"
android:paddingBottom="8dp">
android:paddingBottom="4dp">
<HorizontalScrollView
android:id="@+id/actionLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:layout_marginBottom="8dp"
android:fillViewport="true"
android:scrollbars="none">
<LinearLayout
android:id="@+id/actionLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
@ -163,7 +165,6 @@
android:id="@+id/ending"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:background="@drawable/shape_text"
android:textColor="@color/white"
android:textSize="14sp"
@ -176,7 +177,8 @@
android:id="@+id/parseLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
@ -194,16 +196,38 @@
android:id="@+id/parse"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
tools:layout_height="36dp" />
</LinearLayout>
<com.fongmi.android.tv.ui.custom.CustomSeekView
android:id="@+id/seek"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp" />
android:gravity="center_vertical"
android:orientation="horizontal">
<com.fongmi.android.tv.ui.custom.CustomSeekView
android:id="@+id/seek"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_weight="1" />
<ImageView
android:id="@+id/lock"
android:layout_width="28dp"
android:layout_height="28dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="4dp"
android:src="@drawable/ic_lock_off" />
<ImageView
android:id="@+id/full"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="4dp"
android:src="@drawable/ic_full_off" />
</LinearLayout>
</LinearLayout>
Loading…
Cancel
Save