提交 fa0fc48d 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.
上级 8ac09f2e
......@@ -88,18 +88,21 @@ public class FTXEvent {
// PIP error, Android version is too low.
// pip 错误,android版本过低
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 错误,画中画权限关闭/设备不支持画中画
// PIP error, picture-in-picture permission is turned off.
// pip 错误,画中画权限关闭
public static final int ERROR_PIP_DENIED_PERMISSION = -102;
// PIP error, current interface has been destroyed.
// pip 错误,当前界面已销毁
public static final int ERROR_PIP_ACTIVITY_DESTROYED = -103;
// PIP error, miss player
// 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 错误,已经存在画中画窗口
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
// 来自画中画容器的事件,eventBus键值
public static final String EVENT_PIP_ACTION = "com.tencent.flutter.pipevent";
......@@ -143,6 +146,9 @@ public class FTXEvent {
// End parameters of PIP.
// 画中画结束参数
public static final String EXTRA_NAME_RESULT = "pipResult";
// End parameters of PIP.
// 画中画结束参数
public static final String EXTRA_NAME_IS_PLAYING = "isPlaying";
// VOD player.
// 点播播放器
......
......@@ -167,7 +167,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
boolean isSuccess =
activity.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE);
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");
} else if (!hasPipPermission(activity)) {
pipResult = FTXEvent.ERROR_PIP_DENIED_PERMISSION;
......@@ -193,7 +193,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
android.os.Process.myUid(), activity.getPackageName());
return permissionResult == AppOpsManager.MODE_ALLOWED;
} else {
return false;
return true;
}
}
......@@ -201,6 +201,16 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
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.
*
......@@ -226,6 +236,7 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
if (misInit) {
TXSimpleEventBus.getInstance().unregister(FTXEvent.EVENT_PIP_ACTION, this);
TXSimpleEventBus.getInstance().unregister(FTXEvent.EVENT_PIP_PLAYER_EVENT_ACTION, this);
misInit = false;
}
} catch (Exception e) {
LiteavLog.e(TAG, "releaseActivityListener error", e);
......@@ -239,8 +250,10 @@ public class FTXPIPManager implements TXSimpleEventBus.EventSubscriber {
*/
public void updatePipActions(PipParams params) {
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.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.putExtra("data", bundle);
mActivityBinding.getActivity().startActivity(intent);
}
......
......@@ -341,6 +341,9 @@ public class FTXVodPlayer extends FTXBasePlayer implements ITXVodPlayListener, F
void playerPause() {
if (mVodPlayer != null) {
mVodPlayer.pause();
if (mPipManager.isInPipMode()) {
mPipManager.notifyCurrentPipPlayerPlayState(getPlayerId(), isPlayerPlaying());
}
}
}
......@@ -844,4 +847,15 @@ public class FTXVodPlayer extends FTXBasePlayer implements ITXVodPlayListener, F
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
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.
// See also: https://pub.dev/packages/pigeon
......@@ -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 {
public static final TXFlutterSuperPlayerPluginAPICodec INSTANCE = new TXFlutterSuperPlayerPluginAPICodec();
......@@ -3857,16 +3942,18 @@ public class FtxMessages {
case (byte) 138:
return StringListPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 139:
return StringPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
return StringOptionPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 140:
return SubTitlePlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
return StringPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 141:
return SubTitleRenderModelPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
return SubTitlePlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 142:
return TXPlayInfoParamsPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
return SubTitleRenderModelPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 143:
return TXPlayerDrmMsg.fromList((ArrayList<Object>) readValue(buffer));
return TXPlayInfoParamsPlayerMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 144:
return TXPlayerDrmMsg.fromList((ArrayList<Object>) readValue(buffer));
case (byte) 145:
return UInt8ListMsg.fromList((ArrayList<Object>) readValue(buffer));
default:
return super.readValueOfType(type, buffer);
......@@ -3908,23 +3995,26 @@ public class FtxMessages {
} else if (value instanceof StringListPlayerMsg) {
stream.write(138);
writeValue(stream, ((StringListPlayerMsg) value).toList());
} else if (value instanceof StringPlayerMsg) {
} else if (value instanceof StringOptionPlayerMsg) {
stream.write(139);
writeValue(stream, ((StringOptionPlayerMsg) value).toList());
} else if (value instanceof StringPlayerMsg) {
stream.write(140);
writeValue(stream, ((StringPlayerMsg) value).toList());
} else if (value instanceof SubTitlePlayerMsg) {
stream.write(140);
stream.write(141);
writeValue(stream, ((SubTitlePlayerMsg) value).toList());
} else if (value instanceof SubTitleRenderModelPlayerMsg) {
stream.write(141);
stream.write(142);
writeValue(stream, ((SubTitleRenderModelPlayerMsg) value).toList());
} else if (value instanceof TXPlayInfoParamsPlayerMsg) {
stream.write(142);
stream.write(143);
writeValue(stream, ((TXPlayInfoParamsPlayerMsg) value).toList());
} else if (value instanceof TXPlayerDrmMsg) {
stream.write(143);
stream.write(144);
writeValue(stream, ((TXPlayerDrmMsg) value).toList());
} else if (value instanceof UInt8ListMsg) {
stream.write(144);
stream.write(145);
writeValue(stream, ((UInt8ListMsg) value).toList());
} else {
super.writeValue(stream, value);
......@@ -4207,6 +4297,8 @@ public class FtxMessages {
void setSubtitleStyle(@NonNull SubTitleRenderModelPlayerMsg playerMsg);
void setStringOption(@NonNull StringOptionPlayerMsg playerMsg);
/** The codec used by TXFlutterVodPlayerApi. */
static @NonNull MessageCodec<Object> getCodec() {
return TXFlutterVodPlayerApiCodec.INSTANCE;
......@@ -5163,6 +5255,30 @@ public class FtxMessages {
api.setSubtitleStyle(playerMsgArg);
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) {
ArrayList<Object> wrappedError = wrapError(exception);
wrapped = wrappedError;
......
......@@ -9,6 +9,7 @@ import androidx.annotation.Nullable;
import com.tencent.liteav.base.util.LiteavLog;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
......@@ -19,7 +20,7 @@ public class TXFlutterEngineHolder {
private static final String TAG = "TXFlutterEngineHolder";
private static final class SingletonInstance {
private static TXFlutterEngineHolder instance = new TXFlutterEngineHolder();
private static final TXFlutterEngineHolder instance = new TXFlutterEngineHolder();
}
private int mFrontContextCount = 0;
......@@ -27,7 +28,7 @@ public class TXFlutterEngineHolder {
private final List<TXAppStatusListener> mListeners = new ArrayList<>();
private boolean mIsEnterBack = false;
private final List<Activity> mActivityList = new ArrayList<>();
private final List<WeakReference<Activity>> mActivityList = new ArrayList<>();
public static TXFlutterEngineHolder getInstance() {
return SingletonInstance.instance;
......@@ -66,13 +67,12 @@ public class TXFlutterEngineHolder {
@Override
public void onActivityResumed(@NonNull Activity activity) {
synchronized (mActivityList) {
if (mActivityList.contains(activity)) {
int index = findIndexByAct(activity);
if (index >= 0) {
// refresh index
mActivityList.remove(activity);
mActivityList.add(activity);
} else {
mActivityList.add(activity);
mActivityList.remove(index);
}
mActivityList.add(new WeakReference<>(activity));
}
}
......@@ -105,6 +105,20 @@ public class TXFlutterEngineHolder {
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() {
return !mIsEnterBack;
}
......@@ -114,7 +128,7 @@ public class TXFlutterEngineHolder {
if (index >= mActivityList.size() || index < 0) {
return null;
}
return mActivityList.get(index);
return mActivityList.get(index).get();
}
}
......
......@@ -95,7 +95,12 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
handlePlayBack();
break;
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();
}
break;
case FTXEvent.EXTRA_PIP_PLAY_FORWARD:
handlePlayForward();
......@@ -127,8 +132,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
playerHolder.tmpPause();
pipPlayerHolder = playerHolder;
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.putExtra(FTXEvent.EXTRA_NAME_PARAMS, params);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.putExtra("data", bundle);
activity.startActivity(intent);
return FTXEvent.NO_ERROR;
}
......@@ -159,7 +167,9 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
finish();
}
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) {
LiteavLog.e(TAG, "lack pip params,please check the argument");
finish();
......@@ -171,6 +181,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
configPipMode(null);
}
}
}
handleIntent(intent);
}
......@@ -330,8 +341,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
} else if (TextUtils.equals(action, FTXEvent.PIP_ACTION_EXIT)) {
exitPip(true);
} 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);
}
} else {
LiteavLog.e(TAG, "unknown pip action:" + action);
}
......@@ -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.
* <p>
......@@ -386,14 +415,22 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
@Override
public void run() {
overridePendingTransition(0, 0);
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish();
}
mIsPipFinishing = false;
movePreActToFront();
}
}, 500);
}, 600);
} else {
overridePendingTransition(0, 0);
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
} else {
finish();
}
mIsPipFinishing = false;
}
}
......@@ -407,7 +444,8 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
}
private void startPlay() {
boolean isInitPlaying = pipPlayerHolder.isPlayingWhenCreate();
if (null != mPlayerHolder) {
boolean isInitPlaying = mPlayerHolder.isPlayingWhenCreate();
if (isInitPlaying) {
if (mPlayerHolder.getPlayerType() == FTXEvent.PLAYER_VOD) {
mPlayerHolder.getVodPlayer().resume();
......@@ -415,6 +453,9 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
mPlayerHolder.getLivePlayer().resume();
}
}
} else {
LiteavLog.e(TAG, "miss player when startPlay");
}
}
@Override
......@@ -455,7 +496,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
@Override
protected void onDestroy() {
unRegisterPipBroadcast();
if (Build.VERSION.SDK_INT >= VERSION_CODES.S) {
if (Build.VERSION.SDK_INT >= VERSION_CODES.Q) {
unbindService(this);
}
mPlayerHolder = null;
......@@ -466,7 +507,7 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
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);
startService(serviceIntent);
bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
......@@ -519,7 +560,11 @@ public class FlutterPipImplActivity extends Activity implements TextureView.Surf
livePlayer.pause();
}
}
mCurrentParams.setIsPlaying(dstPlaying);
handleResumeOrPause(dstPlaying);
}
private void handleResumeOrPause(boolean playingStatus) {
mCurrentParams.setIsPlaying(playingStatus);
updatePip(mCurrentParams);
}
......
......@@ -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
......@@ -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
......
// // Copyright (c) 2022 Tencent. All rights reserved.
// Copyright (c) 2022 Tencent. All rights reserved.
// Autogenerated from Pigeon (v9.2.5), do not edit directly.
// See also: https://pub.dev/packages/pigeon
......@@ -37,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
@class MapMsg;
@class SubTitlePlayerMsg;
@class SubTitleRenderModelPlayerMsg;
@class StringOptionPlayerMsg;
/// Pigeon original component, used to generate native communication code for `messages`.
/// The generation command is as follows. When using the generation command,
......@@ -379,6 +380,15 @@ NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, strong, nullable) NSNumber * playerId;
@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.
NSObject<FlutterMessageCodec> *TXFlutterSuperPlayerPluginAPIGetCodec(void);
......@@ -711,6 +721,7 @@ NSObject<FlutterMessageCodec> *TXFlutterVodPlayerApiGetCodec(void);
- (void)selectTrackPlayerMsg:(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)setStringOptionPlayerMsg:(StringOptionPlayerMsg *)playerMsg error:(FlutterError *_Nullable *_Nonnull)error;
@end
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.
// See also: https://pub.dev/packages/pigeon
......@@ -178,6 +178,12 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
- (NSArray *)toList;
@end
@interface StringOptionPlayerMsg ()
+ (StringOptionPlayerMsg *)fromList:(NSArray *)list;
+ (nullable StringOptionPlayerMsg *)nullableFromList:(NSArray *)list;
- (NSArray *)toList;
@end
@implementation PlayerMsg
+ (instancetype)makeWithPlayerId:(nullable NSNumber *)playerId {
PlayerMsg* pigeonResult = [[PlayerMsg alloc] init];
......@@ -1088,6 +1094,35 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
}
@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
@end
@implementation TXFlutterSuperPlayerPluginAPICodecReader
......@@ -1690,16 +1725,18 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec
case 138:
return [StringListPlayerMsg fromList:[self readValue]];
case 139:
return [StringPlayerMsg fromList:[self readValue]];
return [StringOptionPlayerMsg fromList:[self readValue]];
case 140:
return [SubTitlePlayerMsg fromList:[self readValue]];
return [StringPlayerMsg fromList:[self readValue]];
case 141:
return [SubTitleRenderModelPlayerMsg fromList:[self readValue]];
return [SubTitlePlayerMsg fromList:[self readValue]];
case 142:
return [TXPlayInfoParamsPlayerMsg fromList:[self readValue]];
return [SubTitleRenderModelPlayerMsg fromList:[self readValue]];
case 143:
return [TXPlayerDrmMsg fromList:[self readValue]];
return [TXPlayInfoParamsPlayerMsg fromList:[self readValue]];
case 144:
return [TXPlayerDrmMsg fromList:[self readValue]];
case 145:
return [UInt8ListMsg fromList:[self readValue]];
default:
return [super readValueOfType:type];
......@@ -1744,24 +1781,27 @@ void TXFlutterNativeAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObjec
} else if ([value isKindOfClass:[StringListPlayerMsg class]]) {
[self writeByte:138];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[StringPlayerMsg class]]) {
} else if ([value isKindOfClass:[StringOptionPlayerMsg class]]) {
[self writeByte:139];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[SubTitlePlayerMsg class]]) {
} else if ([value isKindOfClass:[StringPlayerMsg class]]) {
[self writeByte:140];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[SubTitleRenderModelPlayerMsg class]]) {
} else if ([value isKindOfClass:[SubTitlePlayerMsg class]]) {
[self writeByte:141];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[TXPlayInfoParamsPlayerMsg class]]) {
} else if ([value isKindOfClass:[SubTitleRenderModelPlayerMsg class]]) {
[self writeByte:142];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[TXPlayerDrmMsg class]]) {
} else if ([value isKindOfClass:[TXPlayInfoParamsPlayerMsg class]]) {
[self writeByte:143];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[UInt8ListMsg class]]) {
} else if ([value isKindOfClass:[TXPlayerDrmMsg class]]) {
[self writeByte:144];
[self writeValue:[value toList]];
} else if ([value isKindOfClass:[UInt8ListMsg class]]) {
[self writeByte:145];
[self writeValue:[value toList]];
} else {
[super writeValue:value];
}
......@@ -2690,6 +2730,25 @@ void TXFlutterVodPlayerApiSetup(id<FlutterBinaryMessenger> binaryMessenger, NSOb
[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
@end
......
......@@ -318,6 +318,13 @@ class SubTitleRenderModelPlayerMsg {
int? playerId;
}
class StringOptionPlayerMsg {
String? key;
// pass obj value
List<Object?>? value;
int? playerId;
}
@HostApi()
abstract class TXFlutterSuperPlayerPluginAPI {
StringMsg getPlatformVersion();
......@@ -642,6 +649,8 @@ abstract class TXFlutterVodPlayerApi {
void deselectTrack(IntPlayerMsg playerMsg);
void setSubtitleStyle(SubTitleRenderModelPlayerMsg playerMsg);
void setStringOption(StringOptionPlayerMsg playerMsg);
}
@HostApi()
......
......@@ -336,14 +336,14 @@ abstract class TXVodPlayEvent {
// PIP error, Android version is too low.
// pip 错误,android版本过低
static const ERROR_PIP_LOWER_VERSION = -101;
// PIP error, picture-in-picture permission is turned off/device does not support picture-in-picture.
// pip 错误,画中画权限关闭/设备不支持画中画
// PIP error, picture-in-picture permission is turned off
// pip 错误,画中画权限关闭
static const ERROR_PIP_DENIED_PERMISSION = -102;
// PIP error, current interface has been destroyed.
// pip 错误,当前界面已销毁
static const ERROR_PIP_ACTIVITY_DESTROYED = -103;
// PIP error, device or system version not supported (PIP is only supported on iPad iOS9+)
// pip 错误,设备或系统版本不支持(iPad iOS9+ 才支持PIP)
// PIP error, device or system version not supported (PIP is only supported on iPad iOS9+ and android 24)
// pip 错误,设备或系统版本不支持(iPad iOS9+ 才支持PIP, android 24 以上支持
static const ERROR_IOS_PIP_DEVICE_NOT_SUPPORT = -104;
// PIP error, player does not support (only support iOS).
// pip 错误,播放器不支持 only support iOS
......@@ -357,11 +357,11 @@ abstract class TXVodPlayEvent {
// PIP error, PIP controller error (only support iOS).
// pip 错误,PIP控制器报错 only support iOS
static const ERROR_IOS_PIP_FROM_SYSTEM = -108;
// PIP error, player object does not exist (only support iOS).
// pip 错误,播放器对象不存在 only support iOS
// PIP error, player object does not exist
// pip 错误,播放器对象不存在
static const ERROR_IOS_PIP_PLAYER_NOT_EXIST = -109;
// PIP error, PIP function is already running (only support iOS).
// pip 错误,PIP功能已经运行 only support iOS
// PIP error, PIP function is already running
// pip 错误,PIP功能已经运行
static const ERROR_IOS_PIP_IS_RUNNING = -110;
// PIP error, PIP function is not started (only support iOS).
// pip 错误,PIP功能没有启动 only support iOS
......
......@@ -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 {
const _TXFlutterSuperPlayerPluginAPICodec();
@override
......@@ -1753,24 +1784,27 @@ class _TXFlutterVodPlayerApiCodec extends StandardMessageCodec {
} else if (value is StringListPlayerMsg) {
buffer.putUint8(138);
writeValue(buffer, value.encode());
} else if (value is StringPlayerMsg) {
} else if (value is StringOptionPlayerMsg) {
buffer.putUint8(139);
writeValue(buffer, value.encode());
} else if (value is SubTitlePlayerMsg) {
} else if (value is StringPlayerMsg) {
buffer.putUint8(140);
writeValue(buffer, value.encode());
} else if (value is SubTitleRenderModelPlayerMsg) {
} else if (value is SubTitlePlayerMsg) {
buffer.putUint8(141);
writeValue(buffer, value.encode());
} else if (value is TXPlayInfoParamsPlayerMsg) {
} else if (value is SubTitleRenderModelPlayerMsg) {
buffer.putUint8(142);
writeValue(buffer, value.encode());
} else if (value is TXPlayerDrmMsg) {
} else if (value is TXPlayInfoParamsPlayerMsg) {
buffer.putUint8(143);
writeValue(buffer, value.encode());
} else if (value is UInt8ListMsg) {
} else if (value is TXPlayerDrmMsg) {
buffer.putUint8(144);
writeValue(buffer, value.encode());
} else if (value is UInt8ListMsg) {
buffer.putUint8(145);
writeValue(buffer, value.encode());
} else {
super.writeValue(buffer, value);
}
......@@ -1802,16 +1836,18 @@ class _TXFlutterVodPlayerApiCodec extends StandardMessageCodec {
case 138:
return StringListPlayerMsg.decode(readValue(buffer)!);
case 139:
return StringPlayerMsg.decode(readValue(buffer)!);
return StringOptionPlayerMsg.decode(readValue(buffer)!);
case 140:
return SubTitlePlayerMsg.decode(readValue(buffer)!);
return StringPlayerMsg.decode(readValue(buffer)!);
case 141:
return SubTitleRenderModelPlayerMsg.decode(readValue(buffer)!);
return SubTitlePlayerMsg.decode(readValue(buffer)!);
case 142:
return TXPlayInfoParamsPlayerMsg.decode(readValue(buffer)!);
return SubTitleRenderModelPlayerMsg.decode(readValue(buffer)!);
case 143:
return TXPlayerDrmMsg.decode(readValue(buffer)!);
return TXPlayInfoParamsPlayerMsg.decode(readValue(buffer)!);
case 144:
return TXPlayerDrmMsg.decode(readValue(buffer)!);
case 145:
return UInt8ListMsg.decode(readValue(buffer)!);
default:
return super.readValueOfType(type, buffer);
......@@ -2948,6 +2984,28 @@ class TXFlutterVodPlayerApi {
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 {
......
......@@ -704,6 +704,15 @@ class TXVodPlayerController extends ChangeNotifier implements ValueListenable<TX
..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
///
/// 释放controller
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论