3import android.app.Activity;
4import android.content.Context;
5import android.content.ContextWrapper;
6import android.graphics.Rect;
7import android.os.Build;
8import android.os.Bundle;
9import android.util.AttributeSet;
10import android.util.Log;
11import android.view.GestureDetector;
12import android.view.LayoutInflater;
13import android.view.MotionEvent;
14import android.view.View;
15import android.view.ViewGroup;
16import android.widget.FrameLayout;
17import android.widget.RelativeLayout;
19import androidx.annotation.NonNull;
20import androidx.annotation.Nullable;
21import androidx.fragment.app.Fragment;
22import androidx.fragment.app.FragmentActivity;
24import com.zipow.videobox.mainboard.Mainboard;
25import com.zipow.videobox.mainboard.ZmMainBoardMgr;
26import com.zipow.videobox.mainboard.module.ZmSdkMainBoard;
27import com.zipow.videobox.sdk.SDKConstants;
28import com.zipow.videobox.sdk.SDKMainHandler;
29import com.zipow.videobox.sdk.SDKShareInView;
30import com.zipow.videobox.sdk.SDKVideoRenderer;
31import com.zipow.videobox.sdk.SDKVideoView;
32import com.zipow.videobox.utils.ZmUtils;
33import com.zipow.videobox.view.video.VideoRenderer;
35import javax.microedition.khronos.opengles.GL10;
38import kotlin.jvm.functions.Function1;
39import us.zoom.business.common.ZmBusinessModuleMgr;
40import us.zoom.common.crossplatform.cmmlib.BuildConfig;
41import us.zoom.core.helper.ZMLog;
42import us.zoom.internal.impl.InMeetingShareControllerImpl;
43import us.zoom.docs.bridge.tocpp.IConfZoomDocs;
44import us.zoom.docs.conf.cplusenum.WebViewInstanceTag;
45import us.zoom.docs.service.StaticInnerService;
46import us.zoom.docs.ui.share.ZoomDocsShareFragment;
47import us.zoom.hybrid.safeweb.core.WebHelper;
48import us.zoom.internal.impl.InMeetingWhiteboardControllerImpl;
49import us.zoom.internal.jni.bean.CmmDocsCollaborationSource;
50import us.zoom.internal.jni.helper.ZoomMeetingSDKBridgeHelper;
51import us.zoom.internal.jni.helper.ZoomMeetingSDKDocsHelper;
52import us.zoom.internal.view.SDKWBViewerFragment;
53import us.zoom.libtools.fragmentmanager.ISafeTransaction;
54import us.zoom.libtools.fragmentmanager.SafeTransactionKt;
55import us.zoom.libtools.storage.PreferenceUtil;
56import us.zoom.libtools.utils.ZmDeviceUtils;
57import us.zoom.internal.SDKCustomizedMeetingUIHelper;
58import us.zoom.internal.SDKDisclaimerDialogManager;
59import us.zoom.internal.impl.MobileRTCVideoViewManagerImpl;
60import us.zoom.libtools.utils.ZmStringUtils;
61import us.zoom.unite.cplusenum.UnifyWebViewAppType;
62import us.zoom.unite.logic.UniteBaseLogic;
63import us.zoom.videomeetings.R;
71public class MobileRTCVideoView extends RelativeLayout implements SDKVideoView.Listener, GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
97 super(context, attrs);
102 super(context, attrs, defStyle);
106 private void init(Context context) {
107 mView = (ViewGroup)LayoutInflater.from(context).inflate(R.layout.zm_videoview_sdk,
null,
false);
109 mShareView = (SDKShareInView)
mView.findViewById(R.id.zm_sdk_viewingShare);
117 if (inMeetingService !=
null) {
119 if (wbController instanceof InMeetingWhiteboardControllerImpl) {
128 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
129 mVideoView.setPreserveEGLContextOnPause(
true);
140 if(!isInEditMode() && isEnabled) {
159 mVideoView.setZOrderMediaOverlay(isMediaOverlay);
183 if(!SDKCustomizedMeetingUIHelper.isSdkEnableCustomizedUI()|| !SDKCustomizedMeetingUIHelper.isSdkUsingCustomizedMeetingUI()) {
187 Mainboard mainboard = ZmMainBoardMgr.getMainboard();
188 if(mainboard !=
null && !((ZmSdkMainBoard)mainboard.getSdkMainBoard()).isSDKConfAppCreated()) {
196 if(SDKCustomizedMeetingUIHelper.isSdkEnableCustomizedUI() && SDKCustomizedMeetingUIHelper.isSdkUsingCustomizedMeetingUI()) {
199 Mainboard mainboard = ZmMainBoardMgr.getMainboard();
200 if(mainboard !=
null && !((ZmSdkMainBoard)mainboard.getSdkMainBoard()).isSDKConfAppCreated()) {
231 public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX,
244 public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX,
288 Rect rect =
new Rect();
289 if (getGlobalVisibleRect(rect)) {
290 if (rect.width() * rect.height() >= getMeasuredWidth() * getMeasuredHeight()/2) {
324 super(glView, groupIndex);
330 long curTime = System.currentTimeMillis();
331 if(curTime < lastIdleTaskTime || curTime - lastIdleTaskTime > 500) {
333 SDKMainHandler.getInstance().post(
new Runnable() {
344 if(ZmDeviceUtils.getCPUKernalNumbers() < 2 && ZmDeviceUtils.getCPUKernelFrequency(0, ZmDeviceUtils.FLAG_MAX_FREQUENCY) < 1400000) {
356 Log.i(
TAG,
"onGLSurfaceChanged group index =" +
mGroupIndex +
", width=" + width +
", height=" + height);
358 if(!isInitialized()) {
362 SDKMainHandler.getInstance().post(
new Runnable() {
375 SDKMainHandler.getInstance().post(
new Runnable() {
389 if(
null!=inMeetingService){
391 if(
null!=shareController&&shareController instanceof InMeetingShareControllerImpl){
392 InMeetingShareControllerImpl shareControllerImpl=(InMeetingShareControllerImpl)shareController;
393 shareControllerImpl.setFragmentActivity(context);
400 super.onAttachedToWindow();
401 Context context = getContext();
402 SDKDisclaimerDialogManager.getInstance().setDisclaimerDialogContext(context);
404 if (context instanceof Activity) {
406 ZmUtils.detectGPUInfo((Activity) context);
408 if(context instanceof ContextWrapper){
409 context=((ContextWrapper)context).getBaseContext();
410 if (context instanceof Activity) {
412 ZmUtils.detectGPUInfo((Activity) context);
420 super.onDetachedFromWindow();
424 private static final String
WB_TAG =
TAG +
"Whiteboard";
427 boolean enableWBInView = PreferenceUtil.readBooleanValue(SDKConstants.SDK_ENABLE_SWITCH_WB_WITH_NORMAL_SHARE,
false);
428 if (!enableWBInView) {
429 if (BuildConfig.LOG_ENABLE) {
430 ZMLog.e(
TAG,
"addWBFragment fail for not enable the feature");
437 if (BuildConfig.LOG_ENABLE) {
438 ZMLog.e(
TAG,
"add WB Fragment fail for mFragmentContainer is null");
444 if (!(
activity instanceof FragmentActivity)) {
445 if (BuildConfig.LOG_ENABLE) {
446 ZMLog.e(
TAG,
"addWBFragment fail for basic Activity");
452 Fragment fragment = ((FragmentActivity)
activity).getSupportFragmentManager().findFragmentByTag(
WB_TAG);
453 if (fragment !=
null) {
454 if (BuildConfig.LOG_ENABLE) {
455 ZMLog.e(
TAG,
"addWBFragment fail for already add the fragment");
462 if (BuildConfig.LOG_ENABLE) {
463 ZMLog.e(
TAG,
"addWBFragment fail for null inMeetingWhiteboardController");
471 fragment =
new SDKWBViewerFragment((FragmentActivity)
activity);
472 Fragment finalFragment = fragment;
473 SafeTransactionKt.startSafeTransaction((FragmentActivity)
activity,
new Function1<ISafeTransaction, Unit>() {
475 public Unit invoke(ISafeTransaction iSafeTransaction) {
476 iSafeTransaction.add(R.id.wbFragmentContainer, finalFragment,
WB_TAG);
477 return Unit.INSTANCE;
486 boolean enableWBInView = PreferenceUtil.readBooleanValue(SDKConstants.SDK_ENABLE_SWITCH_WB_WITH_NORMAL_SHARE,
false);
487 if (!enableWBInView) {
488 if (BuildConfig.LOG_ENABLE) {
489 ZMLog.e(
TAG,
"removeWBFragment fail for not enable the feature");
495 if (BuildConfig.LOG_ENABLE) {
496 ZMLog.e(
TAG,
"remove WB Fragment fail for inMeetingWhiteboardController is null");
502 if (BuildConfig.LOG_ENABLE) {
503 ZMLog.e(
TAG,
"remove WB Fragment fail for mFragmentContainer is null");
508 if (!(
activity instanceof FragmentActivity)) {
509 if (BuildConfig.LOG_ENABLE) {
510 ZMLog.e(
TAG,
"removeWBFragment fail for basic Activity");
516 Fragment fragment = ((FragmentActivity)
activity).getSupportFragmentManager().findFragmentByTag(
WB_TAG);
517 if (fragment ==
null) {
518 if (BuildConfig.LOG_ENABLE) {
519 ZMLog.e(
TAG,
"removeWBFragment fail for can not find the fragment");
526 SafeTransactionKt.startSafeTransaction((FragmentActivity)
activity,
new Function1<ISafeTransaction, Unit>() {
528 public Unit invoke(ISafeTransaction iSafeTransaction) {
529 iSafeTransaction.remove(fragment);
530 return Unit.INSTANCE;
543 if (BuildConfig.LOG_ENABLE) {
544 ZMLog.e(
TAG,
"add doc Fragment fail for mFragmentContainer is null");
549 if (!(
activity instanceof FragmentActivity)) {
550 if (BuildConfig.LOG_ENABLE) {
551 ZMLog.e(
TAG,
"addDocFragment fail for basic Activity");
556 Fragment fragment = ((FragmentActivity)
activity).getSupportFragmentManager().findFragmentByTag(
DOC_TAG);
557 if (fragment !=
null) {
558 if (BuildConfig.LOG_ENABLE) {
559 ZMLog.e(
TAG,
"addDocFragment fail for already add the fragment");
564 Bundle bundle =
getBundle(shareSourceID);
565 if (bundle ==
null) {
566 if (BuildConfig.LOG_ENABLE) {
567 ZMLog.e(
TAG,
"addDocFragment fail for null bundle");
572 IConfZoomDocs docs = StaticInnerService.getConfDocs();
574 if (BuildConfig.LOG_ENABLE) {
575 ZMLog.e(
TAG,
"addDocFragment fail for null docs");
579 docs.setShareSourceId(shareSourceID);
581 fragment = ZoomDocsShareFragment.get(bundle);
582 Fragment finalFragment = fragment;
583 SafeTransactionKt.startSafeTransaction((FragmentActivity)
activity,
new Function1<ISafeTransaction, Unit>() {
585 public Unit invoke(ISafeTransaction iSafeTransaction) {
586 iSafeTransaction.add(R.id.wbFragmentContainer, finalFragment,
DOC_TAG);
587 return Unit.INSTANCE;
595 private @Nullable Bundle
getBundle(
long shareSourceID) {
596 CmmDocsCollaborationSource docsCollaborationSource = ZoomMeetingSDKDocsHelper.getInstance().getDocsCollaborationSource(shareSourceID);
597 if (docsCollaborationSource ==
null) {
600 Bundle bundle =
new Bundle();
601 String url = ZmStringUtils.isEmptyOrNull(docsCollaborationSource.url) ? WebHelper.WEB_BLANK : docsCollaborationSource.url;
602 bundle.putString(StaticInnerService.Consts.KEY_ARGS_URL, url);
603 bundle.putInt(UniteBaseLogic.UniteBundleWrapper.MODULE_TYPE, UnifyWebViewAppType.UnifyWebViewAppType_ZoomDocs);
604 bundle.putInt(StaticInnerService.Consts.KEY_WEBVIEW_INSTANCE_TAG, WebViewInstanceTag.kInstEditor);
605 bundle.putInt(StaticInnerService.Consts.KEY_ARGS_PROCESS, ZmBusinessModuleMgr.PROCESS_TYPE_CONF);
611 if (BuildConfig.LOG_ENABLE) {
612 ZMLog.e(
TAG,
"removeDocFragment fail for mFragmentContainer is null");
617 if (!(
activity instanceof FragmentActivity)) {
618 if (BuildConfig.LOG_ENABLE) {
619 ZMLog.e(
TAG,
"removeDocFragment fail for basic Activity");
624 Fragment fragment = ((FragmentActivity)
activity).getSupportFragmentManager().findFragmentByTag(
DOC_TAG);
625 if (fragment ==
null) {
626 if (BuildConfig.LOG_ENABLE) {
627 ZMLog.e(
TAG,
"removeDocFragment fail for can not find the fragment");
632 SafeTransactionKt.startSafeTransaction((FragmentActivity)
activity,
new Function1<ISafeTransaction, Unit>() {
634 public Unit invoke(ISafeTransaction iSafeTransaction) {
635 iSafeTransaction.remove(fragment);
636 return Unit.INSTANCE;
void onGLSurfaceCreated()
MobileRTCVideoRender(SDKVideoView glView, int groupIndex)
void onGLSurfaceDestroyed()
void onDrawFrame(GL10 gl, VideoRenderer renderer)
void onGLSurfaceChanged(final int width, final int height)
static final int RENDERER_FPS
static final int RENDERER_FPS_LOW_PERFORMANCE
Meeting video view class.
synchronized MobileRTCVideoViewManager getVideoViewMgr()
boolean isVisibleToUser()
MobileRTCSDKError removeDocFragment()
MobileRTCVideoView(Context context, AttributeSet attrs, int defStyle)
FrameLayout mFragmentContainer
boolean onSingleTapConfirmed(MotionEvent e)
static final String WB_TAG
MobileRTCVideoViewManagerImpl mVideoViewMgr
void setZOrderOnTop(boolean onTop)
MobileRTCVideoView(Context context)
boolean onDoubleTapEvent(MotionEvent e)
InMeetingWhiteboardControllerImpl inMeetingWhiteboardController
MobileRTCSDKError addWhiteBoardFragment()
boolean onDoubleTap(MotionEvent e)
SDKShareInView mShareView
static final String DOC_TAG
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
boolean onSingleTapUp(MotionEvent e)
void onShowPress(MotionEvent e)
boolean onDown(MotionEvent e)
GestureDetector mGestureDetector
void onLongPress(MotionEvent e)
MobileRTCVideoRender mVideoRender
void setZOrderMediaOverlay(boolean isMediaOverlay)
MobileRTCVideoView(Context context, AttributeSet attrs)
void initActivity(Context context)
void onDetachedFromWindow()
synchronized MobileRTCVideoViewManager getVideoViewManager()
MobileRTCSDKError addDocFragment(long shareSourceID)
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
Bundle getBundle(long shareSourceID)
void beforeGLContextDestroyed()
void setGestureDetectorEnabled(boolean isEnabled)
void initVideoView(Context context)
MobileRTCSDKError removeWhiteboardFragment()
void onAttachedToWindow()
void init(Context context)
InMeetingService getInMeetingService()
Get InMeetingService instance.
static ZoomSDK getInstance()
Get a shared instance of ZOOM SDK, must call from the main thread.
Enumeration of common errors of SDK.
InMeetingShareController getInMeetingShareController()
InMeetingWhiteboardController getInMeetingWhiteboardController()
Share controller in meeting.
Meeting MobileRTCVideoView manager class. Get the manager object by the interface in MobileRTCVideoVi...