提交 0da59ff5 authored 作者: kongdywang's avatar kongdywang

1. TXVodPlayerController has introduced a new setStringOption interface for configuring extensions.

2. Optimized the logic for determining whether picture-in-picture is supported. 3. The Flutter side's operation of the player can now affect the UI updates for playing and pausing in the picture-in-picture window. 4. Fixed potential memory leak issues. 5. Fixed other known issues. (cherry picked from commit fa0fc48d)
上级 d84aee2d
...@@ -88,18 +88,21 @@ public class FTXEvent { ...@@ -88,18 +88,21 @@ public class FTXEvent {
// PIP error, Android version is too low. // PIP error, Android version is too low.
// pip 错误,android版本过低 // pip 错误,android版本过低
public static final int ERROR_PIP_LOWER_VERSION = -101; public static final int ERROR_PIP_LOWER_VERSION = -101;
// PIP error, picture-in-picture permission is turned off/device does not support picture-in-picture. // PIP error, picture-in-picture permission is turned off.
// pip 错误,画中画权限关闭/设备不支持画中画 // pip 错误,画中画权限关闭
public static final int ERROR_PIP_DENIED_PERMISSION = -102; public static final int ERROR_PIP_DENIED_PERMISSION = -102;
// PIP error, current interface has been destroyed. // PIP error, current interface has been destroyed.
// pip 错误,当前界面已销毁 // pip 错误,当前界面已销毁
public static final int ERROR_PIP_ACTIVITY_DESTROYED = -103; public static final int ERROR_PIP_ACTIVITY_DESTROYED = -103;
// PIP error, miss player // PIP error, miss player
// pip 错误,丢失播放器 // pip 错误,丢失播放器
public static final int ERROR_PIP_MISS_PLAYER = -104; public static final int ERROR_PIP_MISS_PLAYER = -109;
// PIP error, pip is busy // PIP error, pip is busy
// pip 错误,已经存在画中画窗口 // pip 错误,已经存在画中画窗口
public static final int ERROR_PIP_IN_BUSY = -105; public static final int ERROR_PIP_IN_BUSY = -110;
// PIP error, device does not support picture-in-picture.
// pip 错误,设备不支持画中画
public static final int ERROR_PIP_FEATURE_NOT_SUPPORT = -104;
// Event from PIP container,eventBus key value // Event from PIP container,eventBus key value
// 来自画中画容器的事件,eventBus键值 // 来自画中画容器的事件,eventBus键值
public static final String EVENT_PIP_ACTION = "com.tencent.flutter.pipevent"; public static final String EVENT_PIP_ACTION = "com.tencent.flutter.pipevent";
...@@ -143,6 +146,9 @@ public class FTXEvent { ...@@ -143,6 +146,9 @@ public class FTXEvent {
// End parameters of PIP. // End parameters of PIP.
// 画中画结束参数 // 画中画结束参数
public static final String EXTRA_NAME_RESULT = "pipResult"; public static final String EXTRA_NAME_RESULT = "pipResult";
// End parameters of PIP.
// 画中画结束参数
public static final String EXTRA_NAME_IS_PLAYING = "isPlaying";
// VOD player. // VOD player.
// 点播播放器 // 点播播放器
......
...@@ -167,7 +167,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber { ...@@ -167,7 +167,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
boolean isSuccess = boolean isSuccess =
activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE); activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE);
if (!isSuccess) { if (!isSuccess) {
pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION; pipResult = FTXEvent.ERROR_PIP_FEATURE_NOT_SUPPORT;
LiteavLog.e(TAG, "enterPip failed,because PIP feature is disabled"); LiteavLog.e(TAG, "enterPip failed,because PIP feature is disabled");
} else if (!hasPipPermission(activity)) { } else if (!hasPipPermission(activity)) {
pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION; pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION;
...@@ -193,7 +193,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber { ...@@ -193,7 +193,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
android.os.Process.myUid(), activity.getPackageName()); android.os.Process.myUid(), activity.getPackageName());
return permissionResult == AppOpsManager.MODE_ALLOWED; return permissionResult == AppOpsManager.MODE_ALLOWED;
} else { } else {
return false; return true;
} }
} }
...@@ -201,6 +201,16 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber { ...@@ -201,6 +201,16 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
return mIsInPipMode; return mIsInPipMode;
} }
public void notifyCurrentPipPlayerPlayState(int playerId, boolean isPlaying) {
Bundle playOrPauseData = new Bundle();
playOrPauseData.putInt(FTXEvent.EXTRA_NAME_PLAYER_ID, playerId);
playOrPauseData.putInt(FTXEvent.EXTRA_NAME_PLAY_OP, FTXEvent.EXTRA_PIP_PLAY_RESUME_OR_PAUSE);
playOrPauseData.putInt(FTXEvent.EXTRA_NAME_IS_PLAYING, isPlaying ? 1 : 2);
Intent playOrPauseIntent =
new Intent(FTXEvent.ACTION_PIP_PLAY_CONTROL).putExtras(playOrPauseData);
mActivityBinding.getActivity().sendBroadcast(playOrPauseIntent);
}
/** /**
* Set the PIP control callback. If set repeatedly for the same player, it will be overwritten successively. * Set the PIP control callback. If set repeatedly for the same player, it will be overwritten successively.
* *
...@@ -226,6 +236,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber { ...@@ -226,6 +236,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
if (misInit) { if (misInit) {
TXSimpleEventBus.getInstance().unregister(FTXEvent.EVENT_PIP_ACTION, this); TXSimpleEventBus.getInstance().unregister(FTXEvent.EVENT_PIP_ACTION, this);
TXSimpleEventBus.getInstance().unregister(FTXEvent.EVENT_PIP_PLAYER_EVENT_ACTION, this); TXSimpleEventBus.getInstance().unregister(FTXEvent.EVENT_PIP_PLAYER_EVENT_ACTION, this);
misInit = false;
} }
} catch (Exception e) { } catch (Exception e) {
LiteavLog.e(TAG, "releaseActivityListener error", e); LiteavLog.e(TAG, "releaseActivityListener error", e);
...@@ -239,8 +250,10 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber { ...@@ -239,8 +250,10 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
*/ */
public void updatePipActions(PipParams params) { public void updatePipActions(PipParams params) {
Intent intent = new Intent(mActivityBinding.getActivity(), FlutterPipImplActivity.class); Intent intent = new Intent(mActivityBinding.getActivity(), FlutterPipImplActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.setAction(FTXEvent.PIP_ACTION_UPDATE); intent.setAction(FTXEvent.PIP_ACTION_UPDATE);
intent.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params); intent.putExtra("data", bundle);
mActivityBinding.getActivity().startActivity(intent); mActivityBinding.getActivity().startActivity(intent);
} }
......
...@@ -341,6 +341,9 @@ public class FTXVodPlayer extends FTXBasePlayer implements ITXVodPlayListener, F ...@@ -341,6 +341,9 @@ public class FTXVodPlayer extends FTXBasePlayer implements ITXVodPlayListener, F
void playerPause() { void playerPause() {
if (mVodPlayer != null) { if (mVodPlayer != null) {
mVodPlayer.pause(); mVodPlayer.pause();
if (mPipManager.isInPipMode()) {
mPipManager.notifyCurrentPipPlayerPlayState(getPlayerId(), isPlayerPlaying());
}
} }
} }
...@@ -844,4 +847,15 @@ public class FTXVodPlayer extends FTXBasePlayer implements ITXVodPlayListener, F ...@@ -844,4 +847,15 @@ public class FTXVodPlayer extends FTXBasePlayer implements ITXVodPlayListener, F
mVodPlayer.setSubtitleStyle(FTXTransformation.transToTitleRenderModel(playerMsg)); mVodPlayer.setSubtitleStyle(FTXTransformation.transToTitleRenderModel(playerMsg));
} }
} }
@Override
public void setStringOption(@NonNull FtxMessages.StringOptionPlayerMsg playerMsg) {
if (null != mVodPlayer) {
List<Object> values = playerMsg.getValue();
if (null != values && !values.isEmpty()) {
Object value = values.get(0);
mVodPlayer.setStringOption(playerMsg.getKey(), value);
}
}
}
} }
...@@ -403,4 +403,12 @@ public class FTXVodPlayerDispatcher implements FtxMessages.TXFlutterVodPlayerApi ...@@ -403,4 +403,12 @@ public class FTXVodPlayerDispatcher implements FtxMessages.TXFlutterVodPlayerApi
api.setSubtitleStyle(playerMsg); api.setSubtitleStyle(playerMsg);
} }
} }
@Override
public void setStringOption(@NonNull FtxMessages.StringOptionPlayerMsg playerMsg) {
TXFlutterVodPlayerApi api = getPlayer(playerMsg.getPlayerId());
if (null != api) {
api.setStringOption(playerMsg);
}
}
} }
// // Copyright (c) 2022 Tencent. All rights reserved. // Copyright (c) 2022 Tencent. All rights reserved.
// Autogenerated from Pigeon (v9.2.5), do not edit directly. // Autogenerated from Pigeon (v9.2.5), do not edit directly.
// See also: https://pub.dev/packages/pigeon // See also: https://pub.dev/packages/pigeon
...@@ -3118,6 +3118,91 @@ public class FtxMessages { ...@@ -3118,6 +3118,91 @@ public class FtxMessages {
} }
} }
/** Generated class from Pigeon that represents data sent in messages. */
public static final class StringOptionPlayerMsg {
private @Nullable String key;
public @Nullable String getKey() {
return key;
}
public void setKey(@Nullable String setterArg) {
this.key = setterArg;
}
private @Nullable List<Object> value;
public @Nullable List<Object> getValue() {
return value;
}
public void setValue(@Nullable List<Object> setterArg) {
this.value = setterArg;
}
private @Nullable Long playerId;
public @Nullable Long getPlayerId() {
return playerId;
}
public void setPlayerId(@Nullable Long setterArg) {
this.playerId = setterArg;
}
public static final class Builder {
private @Nullable String key;
public @NonNull Builder setKey(@Nullable String setterArg) {
this.key = setterArg;
return this;
}
private @Nullable List<Object> value;
public @NonNull Builder setValue(@Nullable List<Object> setterArg) {
this.value = setterArg;
return this;
}
private @Nullable Long playerId;
public @NonNull Builder setPlayerId(@Nullable Long setterArg) {
this.playerId = setterArg;
return this;
}
public @NonNull StringOptionPlayerMsg build() {
StringOptionPlayerMsg pigeonReturn = new StringOptionPlayerMsg();
pigeonReturn.setKey(key);
pigeonReturn.setValue(value);
pigeonReturn.setPlayerId(playerId);
return pigeonReturn;
}
}
@NonNull
ArrayList<Object> toList() {
ArrayList<Object> toListResult = new ArrayList<Object>(3);
toListResult.add(key);
toListResult.add(value);
toListResult.add(playerId);
return toListResult;
}
static @NonNull StringOptionPlayerMsg fromList(@NonNull ArrayList<Object> list) {
StringOptionPlayerMsg pigeonResult = new StringOptionPlayerMsg();
Object key = list.get(0);
pigeonResult.setKey((String) key);
Object value = list.get(1);
pigeonResult.setValue((List<Object>) value);
Object playerId = list.get(2);
pigeonResult.setPlayerId((playerId == null) ? null : ((playerId instanceof Integer) ? (Integer) playerId : (Long) playerId));
return pigeonResult;
}
}
private static class TXFlutterSuperPlayerPluginAPICodec extends StandardMessageCodec { private static class TXFlutterSuperPlayerPluginAPICodec extends StandardMessageCodec {
public static final TXFlutterSuperPlayerPluginAPICodec INSTANCE = new TXFlutterSuperPlayerPluginAPICodec(); public static final TXFlutterSuperPlayerPluginAPICodec INSTANCE = new TXFlutterSuperPlayerPluginAPICodec();
...@@ -3857,16 +3942,18 @@ public class FtxMessages { ...@@ -3857,16 +3942,18 @@ public class FtxMessages {
case (byte) 138: case (byte) 138:
return StringListPlayerMsg.fromList((ArrayList<Object>) readValue(buffer)); return StringListPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 139: case (byte) 139:
return StringPlayerMsg.fromList((ArrayList<Object>) readValue(buffer)); return StringOptionPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 140: case (byte) 140:
return SubTitlePlayerMsg.fromList((ArrayList<Object>) readValue(buffer)); return StringPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 141: case (byte) 141:
return SubTitleRenderModelPlayerMsg.fromList((ArrayList<Object>) readValue(buffer)); return SubTitlePlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 142: case (byte) 142:
return TXPlayInfoParamsPlayerMsg.fromList((ArrayList<Object>) readValue(buffer)); return SubTitleRenderModelPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 143: case (byte) 143:
return TXPlayerDrmMsg.fromList((ArrayList<Object>) readValue(buffer)); return TXPlayInfoParamsPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 144: case (byte) 144:
return TXPlayerDrmMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 145:
return UInt8ListMsg.fromList((ArrayList<Object>) readValue(buffer)); return UInt8ListMsg.fromList((ArrayList<Object>) readValue(buffer));
default: default:
return super.readValueOfType(type, buffer); return super.readValueOfType(type, buffer);
...@@ -3908,23 +3995,26 @@ public class FtxMessages { ...@@ -3908,23 +3995,26 @@ public class FtxMessages {
} else if (value instanceof StringListPlayerMsg) { } else if (value instanceof StringListPlayerMsg) {
stream.write(138); stream.write(138);
writeValue(stream, ((StringListPlayerMsg) value).toList()); writeValue(stream, ((StringListPlayerMsg) value).toList());
} else if (value instanceof StringPlayerMsg) { } else if (value instanceof StringOptionPlayerMsg) {
stream.write(139); stream.write(139);
writeValue(stream, ((StringOptionPlayerMsg) value).toList());
} else if (value instanceof StringPlayerMsg) {
stream.write(140);
writeValue(stream, ((StringPlayerMsg) value).toList()); writeValue(stream, ((StringPlayerMsg) value).toList());
} else if (value instanceof SubTitlePlayerMsg) { } else if (value instanceof SubTitlePlayerMsg) {
stream.write(140); stream.write(141);
writeValue(stream, ((SubTitlePlayerMsg) value).toList()); writeValue(stream, ((SubTitlePlayerMsg) value).toList());
} else if (value instanceof SubTitleRenderModelPlayerMsg) { } else if (value instanceof SubTitleRenderModelPlayerMsg) {
stream.write(141); stream.write(142);
writeValue(stream, ((SubTitleRenderModelPlayerMsg) value).toList()); writeValue(stream, ((SubTitleRenderModelPlayerMsg) value).toList());
} else if (value instanceof TXPlayInfoParamsPlayerMsg) { } else if (value instanceof TXPlayInfoParamsPlayerMsg) {
stream.write(142); stream.write(143);
writeValue(stream, ((TXPlayInfoParamsPlayerMsg) value).toList()); writeValue(stream, ((TXPlayInfoParamsPlayerMsg) value).toList());
} else if (value instanceof TXPlayerDrmMsg) { } else if (value instanceof TXPlayerDrmMsg) {
stream.write(143); stream.write(144);
writeValue(stream, ((TXPlayerDrmMsg) value).toList()); writeValue(stream, ((TXPlayerDrmMsg) value).toList());
} else if (value instanceof UInt8ListMsg) { } else if (value instanceof UInt8ListMsg) {
stream.write(144); stream.write(145);
writeValue(stream, ((UInt8ListMsg) value).toList()); writeValue(stream, ((UInt8ListMsg) value).toList());
} else { } else {
super.writeValue(stream, value); super.writeValue(stream, value);
...@@ -4207,6 +4297,8 @@ public class FtxMessages { ...@@ -4207,6 +4297,8 @@ public class FtxMessages {
void setSubtitleStyle(@NonNull SubTitleRenderModelPlayerMsg playerMsg); void setSubtitleStyle(@NonNull SubTitleRenderModelPlayerMsg playerMsg);
void setStringOption(@NonNull StringOptionPlayerMsg playerMsg);
/** The codec used by TXFlutterVodPlayerApi. */ /** The codec used by TXFlutterVodPlayerApi. */
static @NonNull MessageCodec<Object> getCodec() { static @NonNull MessageCodec<Object> getCodec() {
return TXFlutterVodPlayerApiCodec.INSTANCE; return TXFlutterVodPlayerApiCodec.INSTANCE;
...@@ -5163,6 +5255,30 @@ public class FtxMessages { ...@@ -5163,6 +5255,30 @@ public class FtxMessages {
api.setSubtitleStyle(playerMsgArg); api.setSubtitleStyle(playerMsgArg);
wrapped.add(0, null); wrapped.add(0, null);
} }
catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
}
reply.reply(wrapped);
});
} else {
channel.setMessageHandler(null);
}
}
{
BasicMessageChannel<Object> channel =
new BasicMessageChannel<>(
binaryMessenger, "dev.flutter.pigeon.TXFlutterVodPlayerApi.setStringOption", getCodec());
if (api != null) {
channel.setMessageHandler(
(message, reply) -> {
ArrayList<Object> wrapped = new ArrayList<Object>();
ArrayList<Object> args = (ArrayList<Object>) message;
StringOptionPlayerMsg playerMsgArg = (StringOptionPlayerMsg) args.get(0);
try {
api.setStringOption(playerMsgArg);
wrapped.add(0, null);
}
catch (Throwable exception) { catch (Throwable exception) {
ArrayList<Object> wrappedError = wrapError(exception); ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError; wrapped = wrappedError;
......
...@@ -9,6 +9,7 @@ import androidx.annotation.Nullable; ...@@ -9,6 +9,7 @@ import androidx.annotation.Nullable;
import com.tencent.liteav.base.util.LiteavLog; import com.tencent.liteav.base.util.LiteavLog;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -19,7 +20,7 @@ public class TXFlutterEngineHolder { ...@@ -19,7 +20,7 @@ public class TXFlutterEngineHolder {
private static final String TAG = "TXFlutterEngineHolder"; private static final String TAG = "TXFlutterEngineHolder";
private static final class SingletonInstance { private static final class SingletonInstance {
private static TXFlutterEngineHolder instance = new TXFlutterEngineHolder(); private static final TXFlutterEngineHolder instance = new TXFlutterEngineHolder();
} }
private int mFrontContextCount = 0; private int mFrontContextCount = 0;
...@@ -27,7 +28,7 @@ public class TXFlutterEngineHolder { ...@@ -27,7 +28,7 @@ public class TXFlutterEngineHolder {
private final List<TXAppStatusListener> mListeners = new ArrayList<>(); private final List<TXAppStatusListener> mListeners = new ArrayList<>();
private boolean mIsEnterBack = false; private boolean mIsEnterBack = false;
private final List<Activity> mActivityList = new ArrayList<>(); private final List<WeakReference<Activity>> mActivityList = new ArrayList<>();
public static TXFlutterEngineHolder getInstance() { public static TXFlutterEngineHolder getInstance() {
return SingletonInstance.instance; return SingletonInstance.instance;
...@@ -66,13 +67,12 @@ public class TXFlutterEngineHolder { ...@@ -66,13 +67,12 @@ public class TXFlutterEngineHolder {
@Override @Override
public void onActivityResumed(@NonNull Activity activity) { public void onActivityResumed(@NonNull Activity activity) {
synchronized (mActivityList) { synchronized (mActivityList) {
if (mActivityList.contains(activity)) { int index = findIndexByAct(activity);
if (index >= 0) {
// refresh index // refresh index
mActivityList.remove(activity); mActivityList.remove(index);
mActivityList.add(activity);
} else {
mActivityList.add(activity);
} }
mActivityList.add(new WeakReference<>(activity));
} }
} }
...@@ -105,6 +105,20 @@ public class TXFlutterEngineHolder { ...@@ -105,6 +105,20 @@ public class TXFlutterEngineHolder {
binding.getActivity().getApplication().registerActivityLifecycleCallbacks(mLifeCallback); binding.getActivity().getApplication().registerActivityLifecycleCallbacks(mLifeCallback);
} }
private int findIndexByAct(Activity activity) {
synchronized (mActivityList) {
int index = -1;
for (int i = 0; i < mActivityList.size(); i++) {
WeakReference<Activity> weakReference = mActivityList.get(i);
if (weakReference.get() == activity) {
index = i;
break;
}
}
return index;
}
}
public boolean isInForeground() { public boolean isInForeground() {
return !mIsEnterBack; return !mIsEnterBack;
} }
...@@ -114,7 +128,7 @@ public class TXFlutterEngineHolder { ...@@ -114,7 +128,7 @@ public class TXFlutterEngineHolder {
if (index >= mActivityList.size() || index < 0) { if (index >= mActivityList.size() || index < 0) {
return null; return null;
} }
return mActivityList.get(index); return mActivityList.get(index).get();
} }
} }
......
...@@ -95,7 +95,12 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -95,7 +95,12 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
handlePlayBack(); handlePlayBack();
break; break;
case FTXEvent.EXTRA_PIP_PLAY_RESUME_OR_PAUSE: case FTXEvent.EXTRA_PIP_PLAY_RESUME_OR_PAUSE:
int isPlaying = data.getInt(FTXEvent.EXTRA_NAME_IS_PLAYING, 0);
if (isPlaying != 0) {
handleResumeOrPause(isPlaying == 1);
} else {
handleResumeOrPause(); handleResumeOrPause();
}
break; break;
case FTXEvent.EXTRA_PIP_PLAY_FORWARD: case FTXEvent.EXTRA_PIP_PLAY_FORWARD:
handlePlayForward(); handlePlayForward();
...@@ -127,8 +132,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -127,8 +132,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
playerHolder.tmpPause(); playerHolder.tmpPause();
pipPlayerHolder = playerHolder; pipPlayerHolder = playerHolder;
Intent intent = new Intent(activity, FlutterPipImplActivity.class); Intent intent = new Intent(activity, FlutterPipImplActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.setAction(FTXEvent.PIP_ACTION_START); intent.setAction(FTXEvent.PIP_ACTION_START);
intent.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.putExtra("data", bundle);
activity.startActivity(intent); activity.startActivity(intent);
return FTXEvent.NO_ERROR; return FTXEvent.NO_ERROR;
} }
...@@ -159,7 +167,9 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -159,7 +167,9 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
finish(); finish();
} }
Intent intent = getIntent(); Intent intent = getIntent();
PipParams params = intent.getParcelableExtra(FTXEvent.EXTRA_NAME_PARAMS); Bundle data = intent.getBundleExtra("data");
if (null != data) {
PipParams params = data.getParcelable(FTXEvent.EXTRA_NAME_PARAMS);
if (null == params) { if (null == params) {
LiteavLog.e(TAG, "lack pip params,please check the argument"); LiteavLog.e(TAG, "lack pip params,please check the argument");
finish(); finish();
...@@ -171,6 +181,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -171,6 +181,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
configPipMode(null); configPipMode(null);
} }
} }
}
handleIntent(intent); handleIntent(intent);
} }
...@@ -330,8 +341,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -330,8 +341,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) { } else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) {
exitPip(true); exitPip(true);
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) { } else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_UPDATE)) {
PipParams pipParams = intent.getParcelableExtra(FTXEvent.EXTRA_NAME_PARAMS); Bundle data = intent.getBundleExtra("data");
if (null != data) {
PipParams pipParams = data.getParcelable(FTXEvent.EXTRA_NAME_PARAMS);
updatePip(pipParams); updatePip(pipParams);
}
} else { } else {
LiteavLog.e(TAG, "unknown pip action:" + action); LiteavLog.e(TAG, "unknown pip action:" + action);
} }
...@@ -361,6 +375,21 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -361,6 +375,21 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
} }
} }
/**
* move task to from。Prevent the issue of picture-in-picture windows failing to launch the app in certain cases.
*/
public void moveCurActToFront() {
mPipContainer.postDelayed(new Runnable() {
@Override
public void run() {
Activity activity = FlutterPipImplActivity.this;
Intent intent = new Intent(FlutterPipImplActivity.this, activity.getClass());
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);
}
},2000);
}
/** /**
* Close picture-in-picture mode by using `finish` to close the current interface. * Close picture-in-picture mode by using `finish` to close the current interface.
* <p> * <p>
...@@ -386,14 +415,22 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -386,14 +415,22 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
@Override @Override
public void run() { public void run() {
overridePendingTransition(0, 0); overridePendingTransition(0, 0);
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish(); finish();
}
mIsPipFinishing = false; mIsPipFinishing = false;
movePreActToFront(); movePreActToFront();
} }
}, 500); }, 600);
} else { } else {
overridePendingTransition(0, 0); overridePendingTransition(0, 0);
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish(); finish();
}
mIsPipFinishing = false; mIsPipFinishing = false;
} }
} }
...@@ -407,7 +444,8 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -407,7 +444,8 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
} }
private void startPlay() { private void startPlay() {
boolean isInitPlaying = pipPlayerHolder.isPlayingWhenCreate(); if (null != mPlayerHolder) {
boolean isInitPlaying = mPlayerHolder.isPlayingWhenCreate();
if (isInitPlaying) { if (isInitPlaying) {
if (mPlayerHolder.getPlayerType() == FTXEvent.PLAYER_VOD) { if (mPlayerHolder.getPlayerType() == FTXEvent.PLAYER_VOD) {
mPlayerHolder.getVodPlayer().resume(); mPlayerHolder.getVodPlayer().resume();
...@@ -415,6 +453,9 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -415,6 +453,9 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
mPlayerHolder.getLivePlayer().resume(); mPlayerHolder.getLivePlayer().resume();
} }
} }
} else {
LiteavLog.e(TAG, "miss player when startPlay");
}
} }
@Override @Override
...@@ -455,7 +496,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -455,7 +496,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
@Override @Override
protected void onDestroy() { protected void onDestroy() {
unRegisterPipBroadcast(); unRegisterPipBroadcast();
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) { if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) {
unbindService(this); unbindService(this);
} }
mPlayerHolder = null; mPlayerHolder = null;
...@@ -466,7 +507,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -466,7 +507,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
private void bindAndroid12BugServiceIfNeed() { private void bindAndroid12BugServiceIfNeed() {
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) { if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) {
Intent serviceIntent = new Intent(this, TXAndroid12BridgeService.class); Intent serviceIntent = new Intent(this, TXAndroid12BridgeService.class);
startService(serviceIntent); startService(serviceIntent);
bindService(serviceIntent, this, Context.BIND_AUTO_CREATE); bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
...@@ -519,7 +560,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf ...@@ -519,7 +560,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
livePlayer.pause(); livePlayer.pause();
} }
} }
mCurrentParams.setIsPlaying(dstPlaying); handleResumeOrPause(dstPlaying);
}
private void handleResumeOrPause(boolean playingStatus) {
mCurrentParams.setIsPlaying(playingStatus);
updatePip(mCurrentParams); updatePip(mCurrentParams);
} }
......
...@@ -1101,5 +1101,15 @@ BOOL CGImageRefContainsAlpha(CGImageRef imageRef) { ...@@ -1101,5 +1101,15 @@ BOOL CGImageRefContainsAlpha(CGImageRef imageRef) {
} }
} }
- (void)setStringOptionPlayerMsg:(StringOptionPlayerMsg *)playerMsg error:(FlutterError * _Nullable __autoreleasing *)error {
if (nil != _txVodPlayer) {
if (playerMsg.value && [playerMsg.value count] != 0) {
id value = playerMsg.value[0];
[_txVodPlayer setExtentOptionInfo:@{
playerMsg.key : value
}];
}
}
}
@end @end
...@@ -318,7 +318,12 @@ ...@@ -318,7 +318,12 @@
} }
} }
- (void)setStringOptionPlayerMsg:(StringOptionPlayerMsg *)playerMsg error:(FlutterError * _Nullable __autoreleasing *)error {
id<TXFlutterVodPlayerApi> api = self.bridge.getPlayers[playerMsg.playerId];
if (api) {
[api setStringOptionPlayerMsg:playerMsg error:error];
}
}
@end @end
......
// // Copyright (c) 2022 Tencent. All rights reserved. // Copyright (c) 2022 Tencent. All rights reserved.
// Autogenerated from Pigeon (v9.2.5), do not edit directly. // Autogenerated from Pigeon (v9.2.5), do not edit directly.
// See also: https://pub.dev/packages/pigeon // See also: https://pub.dev/packages/pigeon
...@@ -37,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN ...@@ -37,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
@class MapMsg; @class MapMsg;
@class SubTitlePlayerMsg; @class SubTitlePlayerMsg;
@class SubTitleRenderModelPlayerMsg; @class SubTitleRenderModelPlayerMsg;
@class StringOptionPlayerMsg;
/// Pigeon original component, used to generate native communication code for `messages`. /// Pigeon original component, used to generate native communication code for `messages`.
/// The generation command is as follows. When using the generation command, /// The generation command is as follows. When using the generation command,
...@@ -379,6 +380,15 @@ NS_ASSUME_NONNULL_BEGIN ...@@ -379,6 +380,15 @@ NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, strong, nullable) NSNumber * playerId; @property(nonatomic, strong, nullable) NSNumber * playerId;
@end @end
@interface StringOptionPlayerMsg : NSObject
+ (instancetype)makeWithKey:(nullable NSString *)key
value:(nullable NSArray<id> *)value
playerId:(nullable NSNumber *)playerId;
@property(nonatomic, copy, nullable) NSString * key;
@property(nonatomic, strong, nullable) NSArray<id> * value;
@property(nonatomic, strong, nullable) NSNumber * playerId;
@end
/// The codec used by TXFlutterSuperPlayerPluginAPI. /// The codec used by TXFlutterSuperPlayerPluginAPI.
NSObject<FlutterMessageCodec> *TXFlutterSuperPlayerPluginAPIGetCodec(void); NSObject<FlutterMessageCodec> *TXFlutterSuperPlayerPluginAPIGetCodec(void);
...@@ -711,6 +721,7 @@ NSObject<FlutterMessageCodec> *TXFlutterVodPlayerApiGetCodec(void); ...@@ -711,6 +721,7 @@ NSObject<FlutterMessageCodec> *TXFlutterVodPlayerApiGetCodec(void);
- (void)selectTrackPlayerMsg:(IntPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error; - (void)selectTrackPlayerMsg:(IntPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error;
- (void)deselectTrackPlayerMsg:(IntPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error; - (void)deselectTrackPlayerMsg:(IntPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error;
- (void)setSubtitleStylePlayerMsg:(SubTitleRenderModelPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error; - (void)setSubtitleStylePlayerMsg:(SubTitleRenderModelPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error;
- (void)setStringOptionPlayerMsg:(StringOptionPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error;
@end @end
extern void TXFlutterVodPlayerApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<TXFlutterVodPlayerApi> *_Nullable api); extern void TXFlutterVodPlayerApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<TXFlutterVodPlayerApi> *_Nullable api);
......
// // Copyright (c) 2022 Tencent. All rights reserved. // Copyright (c) 2022 Tencent. All rights reserved.
// Autogenerated from Pigeon (v9.2.5), do not edit directly. // Autogenerated from Pigeon (v9.2.5), do not edit directly.
// See also: https://pub.dev/packages/pigeon // See also: https://pub.dev/packages/pigeon
...@@ -178,6 +178,12 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { ...@@ -178,6 +178,12 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
- (NSArray *)toList; - (NSArray *)toList;
@end @end
@interface StringOptionPlayerMsg ()
+ (StringOptionPlayerMsg *)fromList:(NSArray *)list;
+ (nullable StringOptionPlayerMsg *)nullableFromList:(NSArray *)list;
- (NSArray *)toList;
@end
@implementation PlayerMsg @implementation PlayerMsg
+ (instancetype)makeWithPlayerId:(nullable NSNumber *)playerId { + (instancetype)makeWithPlayerId:(nullable NSNumber *)playerId {
PlayerMsg* pigeonResult = [[PlayerMsg alloc] init]; PlayerMsg* pigeonResult = [[PlayerMsg alloc] init];
...@@ -1088,6 +1094,35 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { ...@@ -1088,6 +1094,35 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
} }
@end @end
@implementation StringOptionPlayerMsg
+ (instancetype)makeWithKey:(nullable NSString *)key
value:(nullable NSArray<id> *)value
playerId:(nullable NSNumber *)playerId {
StringOptionPlayerMsg* pigeonResult = [[StringOptionPlayerMsg alloc] init];
pigeonResult.key = key;
pigeonResult.value = value;
pigeonResult.playerId = playerId;
return pigeonResult;
}
+ (StringOptionPlayerMsg *)fromList:(NSArray *)list {
StringOptionPlayerMsg *pigeonResult = [[StringOptionPlayerMsg alloc] init];
pigeonResult.key = GetNullableObjectAtIndex(list, 0);
pigeonResult.value = GetNullableObjectAtIndex(list, 1);
pigeonResult.playerId = GetNullableObjectAtIndex(list, 2);
return pigeonResult;
}
+ (nullable StringOptionPlayerMsg *)nullableFromList:(NSArray *)list {
return (list) ? [StringOptionPlayerMsg fromList:list] : nil;
}
- (NSArray *)toList {
return @[
(self.key ?: [NSNull null]),
(self.value ?: [NSNull null]),
(self.playerId ?: [NSNull null]),
];
}
@end
@interface TXFlutterSuperPlayerPluginAPICodecReader : FlutterStandardReader @interface TXFlutterSuperPlayerPluginAPICodecReader : FlutterStandardReader
@end @end
@implementation TXFlutterSuperPlayerPluginAPICodecReader @implementation TXFlutterSuperPlayerPluginAPICodecReader
...@@ -1690,16 +1725,18 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec ...@@ -1690,16 +1725,18 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec
case 138: case 138:
return [StringListPlayerMsg fromList:[self readValue]]; return [StringListPlayerMsg fromList:[self readValue]];
case 139: case 139:
return [StringPlayerMsg fromList:[self readValue]]; return [StringOptionPlayerMsg fromList:[self readValue]];
case 140: case 140:
return [SubTitlePlayerMsg fromList:[self readValue]]; return [StringPlayerMsg fromList:[self readValue]];
case 141: case 141:
return [SubTitleRenderModelPlayerMsg fromList:[self readValue]]; return [SubTitlePlayerMsg fromList:[self readValue]];
case 142: case 142:
return [TXPlayInfoParamsPlayerMsg fromList:[self readValue]]; return [SubTitleRenderModelPlayerMsg fromList:[self readValue]];
case 143: case 143:
return [TXPlayerDrmMsg fromList:[self readValue]]; return [TXPlayInfoParamsPlayerMsg fromList:[self readValue]];
case 144: case 144:
return [TXPlayerDrmMsg fromList:[self readValue]];
case 145:
return [UInt8ListMsg fromList:[self readValue]]; return [UInt8ListMsg fromList:[self readValue]];
default: default:
return [super readValueOfType:type]; return [super readValueOfType:type];
...@@ -1744,24 +1781,27 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec ...@@ -1744,24 +1781,27 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec
} else if ([value isKindOfClass:[StringListPlayerMsg class]]) { } else if ([value isKindOfClass:[StringListPlayerMsg class]]) {
[self writeByte:138]; [self writeByte:138];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[StringPlayerMsg class]]) { } else if ([value isKindOfClass:[StringOptionPlayerMsg class]]) {
[self writeByte:139]; [self writeByte:139];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[SubTitlePlayerMsg class]]) { } else if ([value isKindOfClass:[StringPlayerMsg class]]) {
[self writeByte:140]; [self writeByte:140];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[SubTitleRenderModelPlayerMsg class]]) { } else if ([value isKindOfClass:[SubTitlePlayerMsg class]]) {
[self writeByte:141]; [self writeByte:141];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[TXPlayInfoParamsPlayerMsg class]]) { } else if ([value isKindOfClass:[SubTitleRenderModelPlayerMsg class]]) {
[self writeByte:142]; [self writeByte:142];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[TXPlayerDrmMsg class]]) { } else if ([value isKindOfClass:[TXPlayInfoParamsPlayerMsg class]]) {
[self writeByte:143]; [self writeByte:143];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[UInt8ListMsg class]]) { } else if ([value isKindOfClass:[TXPlayerDrmMsg class]]) {
[self writeByte:144]; [self writeByte:144];
[self writeValue:[value toList]]; [self writeValue:[value toList]];
} else if ([value isKindOfClass:[UInt8ListMsg class]]) {
[self writeByte:145];
[self writeValue:[value toList]];
} else { } else {
[super writeValue:value]; [super writeValue:value];
} }
...@@ -2690,6 +2730,25 @@ void TXFlutterVodPlayerApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSOb ...@@ -2690,6 +2730,25 @@ void TXFlutterVodPlayerApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSOb
[channel setMessageHandler:nil]; [channel setMessageHandler:nil];
} }
} }
{
FlutterBasicMessageChannel *channel =
[[FlutterBasicMessageChannel alloc]
initWithName:@"dev.flutter.pigeon.TXFlutterVodPlayerApi.setStringOption"
binaryMessenger:binaryMessenger
codec:TXFlutterVodPlayerApiGetCodec()];
if (api) {
NSCAssert([api respondsToSelector:@selector(setStringOptionPlayerMsg:error:)], @"TXFlutterVodPlayerApi api (%@) doesn't respond to @selector(setStringOptionPlayerMsg:error:)", api);
[channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
NSArray *args = message;
StringOptionPlayerMsg *arg_playerMsg = GetNullableObjectAtIndex(args, 0);
FlutterError *error;
[api setStringOptionPlayerMsg:arg_playerMsg error:&error];
callback(wrapResult(nil, error));
}];
} else {
[channel setMessageHandler:nil];
}
}
} }
@interface TXFlutterLivePlayerApiCodecReader : FlutterStandardReader @interface TXFlutterLivePlayerApiCodecReader : FlutterStandardReader
@end @end
......
...@@ -318,6 +318,13 @@ class SubTitleRenderModelPlayerMsg { ...@@ -318,6 +318,13 @@ class SubTitleRenderModelPlayerMsg {
int? playerId; int? playerId;
} }
class StringOptionPlayerMsg {
String? key;
// pass obj value
List<Object?>? value;
int? playerId;
}
@HostApi() @HostApi()
abstract class TXFlutterSuperPlayerPluginAPI { abstract class TXFlutterSuperPlayerPluginAPI {
StringMsg getPlatformVersion(); StringMsg getPlatformVersion();
...@@ -642,6 +649,8 @@ abstract class TXFlutterVodPlayerApi { ...@@ -642,6 +649,8 @@ abstract class TXFlutterVodPlayerApi {
void deselectTrack(IntPlayerMsg playerMsg); void deselectTrack(IntPlayerMsg playerMsg);
void setSubtitleStyle(SubTitleRenderModelPlayerMsg playerMsg); void setSubtitleStyle(SubTitleRenderModelPlayerMsg playerMsg);
void setStringOption(StringOptionPlayerMsg playerMsg);
} }
@HostApi() @HostApi()
......
...@@ -336,14 +336,14 @@ abstract class TXVodPlayEvent { ...@@ -336,14 +336,14 @@ abstract class TXVodPlayEvent {
// PIP error, Android version is too low. // PIP error, Android version is too low.
// pip 错误,android版本过低 // pip 错误,android版本过低
static const ERROR_PIP_LOWER_VERSION = -101; static const ERROR_PIP_LOWER_VERSION = -101;
// PIP error, picture-in-picture permission is turned off/device does not support picture-in-picture. // PIP error, picture-in-picture permission is turned off
// pip 错误,画中画权限关闭/设备不支持画中画 // pip 错误,画中画权限关闭
static const ERROR_PIP_DENIED_PERMISSION = -102; static const ERROR_PIP_DENIED_PERMISSION = -102;
// PIP error, current interface has been destroyed. // PIP error, current interface has been destroyed.
// pip 错误,当前界面已销毁 // pip 错误,当前界面已销毁
static const ERROR_PIP_ACTIVITY_DESTROYED = -103; static const ERROR_PIP_ACTIVITY_DESTROYED = -103;
// PIP error, device or system version not supported (PIP is only supported on iPad iOS9+) // PIP error, device or system version not supported (PIP is only supported on iPad iOS9+ and android 24)
// pip 错误,设备或系统版本不支持(iPad iOS9+ 才支持PIP) // pip 错误,设备或系统版本不支持(iPad iOS9+ 才支持PIP, android 24 以上支持
static const ERROR_IOS_PIP_DEVICE_NOT_SUPPORT = -104; static const ERROR_IOS_PIP_DEVICE_NOT_SUPPORT = -104;
// PIP error, player does not support (only support iOS). // PIP error, player does not support (only support iOS).
// pip 错误,播放器不支持 only support iOS // pip 错误,播放器不支持 only support iOS
...@@ -357,11 +357,11 @@ abstract class TXVodPlayEvent { ...@@ -357,11 +357,11 @@ abstract class TXVodPlayEvent {
// PIP error, PIP controller error (only support iOS). // PIP error, PIP controller error (only support iOS).
// pip 错误,PIP控制器报错 only support iOS // pip 错误,PIP控制器报错 only support iOS
static const ERROR_IOS_PIP_FROM_SYSTEM = -108; static const ERROR_IOS_PIP_FROM_SYSTEM = -108;
// PIP error, player object does not exist (only support iOS). // PIP error, player object does not exist
// pip 错误,播放器对象不存在 only support iOS // pip 错误,播放器对象不存在
static const ERROR_IOS_PIP_PLAYER_NOT_EXIST = -109; static const ERROR_IOS_PIP_PLAYER_NOT_EXIST = -109;
// PIP error, PIP function is already running (only support iOS). // PIP error, PIP function is already running
// pip 错误,PIP功能已经运行 only support iOS // pip 错误,PIP功能已经运行
static const ERROR_IOS_PIP_IS_RUNNING = -110; static const ERROR_IOS_PIP_IS_RUNNING = -110;
// PIP error, PIP function is not started (only support iOS). // PIP error, PIP function is not started (only support iOS).
// pip 错误,PIP功能没有启动 only support iOS // pip 错误,PIP功能没有启动 only support iOS
......
...@@ -1027,6 +1027,37 @@ class SubTitleRenderModelPlayerMsg { ...@@ -1027,6 +1027,37 @@ class SubTitleRenderModelPlayerMsg {
} }
} }
class StringOptionPlayerMsg {
StringOptionPlayerMsg({
this.key,
this.value,
this.playerId,
});
String? key;
List<Object?>? value;
int? playerId;
Object encode() {
return <Object?>[
key,
value,
playerId,
];
}
static StringOptionPlayerMsg decode(Object result) {
result as List<Object?>;
return StringOptionPlayerMsg(
key: result[0] as String?,
value: (result[1] as List<Object?>?)?.cast<Object?>(),
playerId: result[2] as int?,
);
}
}
class _TXFlutterSuperPlayerPluginAPICodec extends StandardMessageCodec { class _TXFlutterSuperPlayerPluginAPICodec extends StandardMessageCodec {
const _TXFlutterSuperPlayerPluginAPICodec(); const _TXFlutterSuperPlayerPluginAPICodec();
@override @override
...@@ -1753,24 +1784,27 @@ class _TXFlutterVodPlayerApiCodec extends StandardMessageCodec { ...@@ -1753,24 +1784,27 @@ class _TXFlutterVodPlayerApiCodec extends StandardMessageCodec {
} else if (value is StringListPlayerMsg) { } else if (value is StringListPlayerMsg) {
buffer.putUint8(138); buffer.putUint8(138);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is StringPlayerMsg) { } else if (value is StringOptionPlayerMsg) {
buffer.putUint8(139); buffer.putUint8(139);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is SubTitlePlayerMsg) { } else if (value is StringPlayerMsg) {
buffer.putUint8(140); buffer.putUint8(140);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is SubTitleRenderModelPlayerMsg) { } else if (value is SubTitlePlayerMsg) {
buffer.putUint8(141); buffer.putUint8(141);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is TXPlayInfoParamsPlayerMsg) { } else if (value is SubTitleRenderModelPlayerMsg) {
buffer.putUint8(142); buffer.putUint8(142);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is TXPlayerDrmMsg) { } else if (value is TXPlayInfoParamsPlayerMsg) {
buffer.putUint8(143); buffer.putUint8(143);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is UInt8ListMsg) { } else if (value is TXPlayerDrmMsg) {
buffer.putUint8(144); buffer.putUint8(144);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is UInt8ListMsg) {
buffer.putUint8(145);
writeValue(buffer, value.encode());
} else { } else {
super.writeValue(buffer, value); super.writeValue(buffer, value);
} }
...@@ -1802,16 +1836,18 @@ class _TXFlutterVodPlayerApiCodec extends StandardMessageCodec { ...@@ -1802,16 +1836,18 @@ class _TXFlutterVodPlayerApiCodec extends StandardMessageCodec {
case 138: case 138:
return StringListPlayerMsg.decode(readValue(buffer)!); return StringListPlayerMsg.decode(readValue(buffer)!);
case 139: case 139:
return StringPlayerMsg.decode(readValue(buffer)!); return StringOptionPlayerMsg.decode(readValue(buffer)!);
case 140: case 140:
return SubTitlePlayerMsg.decode(readValue(buffer)!); return StringPlayerMsg.decode(readValue(buffer)!);
case 141: case 141:
return SubTitleRenderModelPlayerMsg.decode(readValue(buffer)!); return SubTitlePlayerMsg.decode(readValue(buffer)!);
case 142: case 142:
return TXPlayInfoParamsPlayerMsg.decode(readValue(buffer)!); return SubTitleRenderModelPlayerMsg.decode(readValue(buffer)!);
case 143: case 143:
return TXPlayerDrmMsg.decode(readValue(buffer)!); return TXPlayInfoParamsPlayerMsg.decode(readValue(buffer)!);
case 144: case 144:
return TXPlayerDrmMsg.decode(readValue(buffer)!);
case 145:
return UInt8ListMsg.decode(readValue(buffer)!); return UInt8ListMsg.decode(readValue(buffer)!);
default: default:
return super.readValueOfType(type, buffer); return super.readValueOfType(type, buffer);
...@@ -2948,6 +2984,28 @@ class TXFlutterVodPlayerApi { ...@@ -2948,6 +2984,28 @@ class TXFlutterVodPlayerApi {
return; return;
} }
} }
Future<void> setStringOption(StringOptionPlayerMsg arg_playerMsg) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.TXFlutterVodPlayerApi.setStringOption', codec,
binaryMessenger: _binaryMessenger);
final List<Object?>? replyList =
await channel.send(<Object?>[arg_playerMsg]) as List<Object?>?;
if (replyList == null) {
throw PlatformException(
code: 'channel-error',
message: 'Unable to establish connection on channel.',
);
} else if (replyList.length > 1) {
throw PlatformException(
code: replyList[0]! as String,
message: replyList[1] as String?,
details: replyList[2],
);
} else {
return;
}
}
} }
class _TXFlutterLivePlayerApiCodec extends StandardMessageCodec { class _TXFlutterLivePlayerApiCodec extends StandardMessageCodec {
......
...@@ -704,6 +704,15 @@ class TXVodPlayerController extends ChangeNotifier implements ValueListenable<TX ...@@ -704,6 +704,15 @@ class TXVodPlayerController extends ChangeNotifier implements ValueListenable<TX
..value = trackIndex); ..value = trackIndex);
} }
Future<void> setStringOption(String key, Object value) async {
if (_isNeedDisposed) return;
await _initPlayer.future;
await _vodPlayerApi.setStringOption(StringOptionPlayerMsg()
..playerId = _playerId
..key = key
..value = [value]);
}
/// release controller /// release controller
/// ///
/// 释放controller /// 释放controller
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论