[mobile] support pip mode action

pull/123/head
FongMi 3 years ago
parent a2885f1fce
commit 9a061c3f1c
  1. 11
      app/src/main/java/com/fongmi/android/tv/bean/Config.java
  2. 13
      app/src/main/java/com/fongmi/android/tv/utils/Utils.java
  3. 20
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  4. 51
      app/src/mobile/java/com/fongmi/android/tv/ui/custom/Pip.java
  5. 10
      app/src/mobile/res/drawable/ic_control_back.xml

@ -6,7 +6,6 @@ import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;
import com.fongmi.android.tv.api.ApiConfig;
import com.fongmi.android.tv.db.AppDatabase;
import java.util.List;
@ -24,6 +23,10 @@ public class Config {
private String home;
private String parse;
public static Config create(int type) {
return create("", type);
}
public static Config create(String url, int type) {
return new Config(url, "", type);
}
@ -149,17 +152,17 @@ public class Config {
public static Config vod() {
Config item = AppDatabase.get().getConfigDao().findOne(0);
return item == null ? create("", 0) : item;
return item == null ? create(0) : item;
}
public static Config live() {
Config item = AppDatabase.get().getConfigDao().findOne(1);
return item == null ? create(ApiConfig.getUrl(), 1) : item;
return item == null ? create(1) : item;
}
public static Config wall() {
Config item = AppDatabase.get().getConfigDao().findOne(2);
return item == null ? create("", 2) : item;
return item == null ? create(2) : item;
}
public static Config find(int id) {

@ -2,7 +2,6 @@ package com.fongmi.android.tv.utils;
import android.Manifest;
import android.app.Activity;
import android.app.PictureInPictureParams;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.pm.PackageManager;
@ -12,7 +11,6 @@ import android.os.IBinder;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Rational;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
@ -87,17 +85,6 @@ 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, Rational rational) {
try {
if (!hasPIP() || activity.isInPictureInPictureMode()) return;
PictureInPictureParams.Builder builder = new PictureInPictureParams.Builder();
builder.setAspectRatio(rational).build();
activity.enterPictureInPictureMode(builder.build());
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean isVideoFormat(String url) {
return isVideoFormat(url, new HashMap<>());
}

@ -7,7 +7,6 @@ import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.Html;
import android.util.Rational;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
@ -40,12 +39,14 @@ import com.fongmi.android.tv.event.RefreshEvent;
import com.fongmi.android.tv.model.SiteViewModel;
import com.fongmi.android.tv.player.ExoUtil;
import com.fongmi.android.tv.player.Players;
import com.fongmi.android.tv.receiver.PipReceiver;
import com.fongmi.android.tv.ui.adapter.EpisodeAdapter;
import com.fongmi.android.tv.ui.adapter.FlagAdapter;
import com.fongmi.android.tv.ui.adapter.ParseAdapter;
import com.fongmi.android.tv.ui.adapter.SearchAdapter;
import com.fongmi.android.tv.ui.base.BaseActivity;
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.EpisodeDialog;
@ -84,9 +85,9 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private SiteViewModel mViewModel;
private FlagAdapter mFlagAdapter;
private TrackDialog mTrackDialog;
private PipReceiver mReceiver;
private History mHistory;
private Players mPlayers;
private String mSiteKey;
private boolean fullscreen;
private boolean initTrack;
private boolean initAuto;
@ -98,6 +99,8 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private Runnable mR1;
private Runnable mR2;
private Runnable mR3;
private String mKey;
private Pip mPip;
public static void push(Activity activity, String url) {
start(activity, "push_agent", url, url);
@ -183,11 +186,13 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
mKeyDown = CustomKeyDownVod.create(this, mBinding.video);
mFrameParams = mBinding.video.getLayoutParams();
mBinding.progressLayout.showProgress();
mReceiver = new PipReceiver(mBinding);
mPlayers = new Players().init();
mR1 = this::hideControl;
mR2 = this::setTraffic;
mR3 = this::setOrient;
mSiteKey = getKey();
mPip = new Pip();
mKey = getKey();
setRecyclerView();
setVideoView();
setViewModel();
@ -733,6 +738,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private void checkPlayImg(boolean playing) {
mBinding.control.play.setImageResource(playing ? com.google.android.exoplayer2.ui.R.drawable.exo_icon_pause : com.google.android.exoplayer2.ui.R.drawable.exo_icon_play);
mPip.update(this, playing);
}
private void checkLockImg() {
@ -929,7 +935,7 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
private void nextSite() {
if (mSearchAdapter.getItemCount() == 0) return;
Vod vod = mSearchAdapter.get(0);
if (vod.getSiteKey().equals(mSiteKey)) return;
if (vod.getSiteKey().equals(mKey)) return;
Notify.show(getString(R.string.play_switch_site, vod.getSiteName()));
mSearchAdapter.remove(0);
setInitAuto(false);
@ -1084,20 +1090,22 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis
@Override
protected void onUserLeaveHint() {
super.onUserLeaveHint();
Utils.enterPIP(this, getScale() == 2 ? new Rational(4, 3) : new Rational(16, 9));
if (isLock()) onLock();
mPip.enter(this, getScale() == 2);
if (isLock()) App.post(this::onLock, 500);
}
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (isInPictureInPictureMode) {
mReceiver.register(this);
enterFullscreen();
hideControl();
hideEpisode();
hideTrack();
} else {
exitFullscreen();
mReceiver.unregister(this);
if (isStop()) finish();
}
}

@ -0,0 +1,51 @@
package com.fongmi.android.tv.ui.custom;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.PictureInPictureParams;
import android.app.RemoteAction;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.util.Rational;
import com.fongmi.android.tv.utils.Utils;
import java.util.ArrayList;
import java.util.List;
public class Pip {
public static final String ACTION_MEDIA_CONTROL = "media_control";
public static final String EXTRA_CONTROL_TYPE = "control_type";
public static final int CONTROL_TYPE_PREV = 1;
public static final int CONTROL_TYPE_NEXT = 2;
public static final int CONTROL_TYPE_PLAY = 3;
private PictureInPictureParams.Builder builder;
public Pip() {
if (!Utils.hasPIP()) return;
this.builder = new PictureInPictureParams.Builder();
}
public void update(Activity activity, boolean play) {
if (!Utils.hasPIP()) return;
List<RemoteAction> 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());
}
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();
activity.enterPictureInPictureMode(builder.build());
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -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="@android:color/white"
android:pathData="M17.77,3.77l-1.77,-1.77l-10,10l10,10l1.77,-1.77l-8.23,-8.23z" />
</vector>
Loading…
Cancel
Save