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...