diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java index 8763bbbbbcb3a77bec17c4c60f4b69b4706c6336..b498ad162661f5ff362aa9568257d5f8fd3e48e4 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -159,10 +159,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl private CasRecord mCasRecord; private Thread rttThread; - //virtual devices - VirtualDeviceSession mVirtualDeviceSession = null; - RingBufferVirtualDeviceIO mRingBufferVirtualDeviceIO = null; - // debug info private boolean isShowingLagInfoView; private Switch lagSwitch; @@ -181,7 +177,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl private RadioButton radioViewMain; private RadioButton radioViewBasic; private boolean bIsStart = false; - private boolean isGotCameraAndRecordPermission = true; private int mOrientation = 0; private String mFrameType = FRAME_TYPE_H265; private String mResolution = RESOLUTION_1080P; @@ -278,7 +273,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl setContentView(R.layout.cas_activity_fullscreen); keepScreenLongLight(this, true); getIntentData(); - initVirtualDeviceSession(); mCasRecord = new CasRecord(getSharedPreferences("input_history", MODE_PRIVATE)); // get views mProgressBar = findViewById(R.id.loading_progress_bar); @@ -361,7 +355,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl mCloudPhone.registerCloudPhoneStateListener(new CloudPhoneStateListenerImpl()); mCloudPhone.registerOnOrientationChangeListener(new CloudPhoneOrientationListener()); - mCloudPhone.registerOnVirtualDevDataListener(new CloudPhoneVirtualDevDataListenerImpl()); mCloudPhone.registerCloudAppDataListener(new CloudAppDataListener() { @Override public void onRecvCloudAppData(byte[] data) { @@ -522,13 +515,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl } } - private void initVirtualDeviceSession() { - if (!isGotCameraAndRecordPermission) return; - mVirtualDeviceSession = new VirtualDeviceSession(this); - mRingBufferVirtualDeviceIO = new RingBufferVirtualDeviceIO(); - mVirtualDeviceSession.setVirtualDeviceIoHook(mRingBufferVirtualDeviceIO); - } - private void processStateChangeMsg(int code, String msg) { CASLog.i(TAG, "processStateChangeMsg code = " + code); switch (code) { @@ -541,9 +527,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl mCasRecord.setRecord("port", mConnectInfo.getConnectPort(), 10); mCasRecord.setRecord("ip:port", mConnectInfo.getConnectIp() + ":" +mConnectInfo.getConnectPort(), 10); } - if (mVirtualDeviceSession != null) { - mVirtualDeviceSession.start(); - } break; case CasState.CAS_SERVER_UNREACHABLE: showDialog(getResources().getString(R.string.cas_phone_connect_server_fail_tip_message)); @@ -868,9 +851,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl doCheckConnection = false; // dismissAllDialogs(); gAcitivity = null; - if (mVirtualDeviceSession != null) { - mVirtualDeviceSession.stop(); - } if (rttThread != null) { rttThread.interrupt(); } @@ -1071,16 +1051,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl } } - class CloudPhoneVirtualDevDataListenerImpl implements CloudPhoneVirtualDevDataListener { - - @Override - public void onRecvVirtualDevData(byte[] data, int length) { - if (mRingBufferVirtualDeviceIO != null) { - mRingBufferVirtualDeviceIO.fillData(data); - } - } - } - public void switchCtrlViewShow() { if (ctrView == null) { return; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java b/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java index c3044a4ba1a1335061dcf65a76ed849b6f053131..f97b656928e0582bb9a401c2f608667230f04ea9 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java @@ -115,13 +115,6 @@ public interface ICloudPhone { */ void registerOnOrientationChangeListener(CloudPhoneOrientationChangeListener listener); - /** - * 设置虚拟设备的回调 - * - * @param listener - */ - void registerOnVirtualDevDataListener(CloudPhoneVirtualDevDataListener listener); - /** * 发送虚拟设备数据 * @param devType diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java index 4cec3edbd9280458810916b3440ebac955ee9f53..767467b00d4e20d51701bfef52a986a8fedf81cd 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -56,6 +56,8 @@ import com.huawei.cloudphone.common.CasParcelableMap; import com.huawei.cloudphone.common.CasState; import com.huawei.cloudphone.service.CASClient; import com.huawei.cloudphone.service.CASService; +import com.huawei.cloudphone.virtualdevice.VirtualDeviceSession; +import com.huawei.cloudphone.virtualdevice.common.RingBufferVirtualDeviceIO; import java.net.BindException; import java.util.HashMap; @@ -132,6 +134,10 @@ public class CloudPhoneImpl implements ICloudPhone { private CloudPhoneImeMgr mImeMgr; + //virtual devices + VirtualDeviceSession mVirtualDeviceSession = null; + RingBufferVirtualDeviceIO mRingBufferVirtualDeviceIO = null; + public CloudPhoneImpl() { mCurrentState = STATE_DEINIT; } @@ -153,6 +159,7 @@ public class CloudPhoneImpl implements ICloudPhone { mListener = new CASListener(); mContext = context; mServiceConnect = false; + initVirtualDeviceSession(); Intent intent = new Intent(mContext, CASService.class); boolean ret = mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE); if (!ret) { @@ -242,6 +249,11 @@ public class CloudPhoneImpl implements ICloudPhone { mActivity = null; mViewGroup = null; mAutoReconnectCount = 0; + if (mVirtualDeviceSession != null) { + mVirtualDeviceSession.stop(); + } + mVirtualDeviceSession = null; + mRingBufferVirtualDeviceIO = null; CASLog.i(TAG, "exitCloudPhone end..."); } } catch (Exception e) { @@ -310,11 +322,6 @@ public class CloudPhoneImpl implements ICloudPhone { mOrientationChangeListener = listener; } - @Override - public void registerOnVirtualDevDataListener(CloudPhoneVirtualDevDataListener listener) { - mVirtualDevDataListener = listener; - } - @Override public void sendVirtualDeviceData(byte devType, byte[] data) { if (mCASClient != null) { @@ -570,6 +577,9 @@ public class CloudPhoneImpl implements ICloudPhone { mCurrentState = STATE_PAUSE; mBackGroundTimer = new Timer(); mBackGroundTimer.schedule(new BackgroundTimerTask(), mBgTimeout); + if (mVirtualDeviceSession != null) { + mVirtualDeviceSession.stop(); + } } } catch (Exception e) { CASLog.e(TAG, "handleSurfaceDestroyCmd failed. " + e.getMessage()); @@ -622,6 +632,14 @@ public class CloudPhoneImpl implements ICloudPhone { } } else if (state == CasState.CAS_START_SUCCESS) { mIsStartSuccess = true; + if (mVirtualDeviceSession != null) { + mVirtualDeviceSession.start(); + } + } else if (state == CasState.CAS_SWITCH_FOREGROUND_SUCCESS + || state == CasState.CAS_RECONNECT_SUCCESS) { + if (mVirtualDeviceSession != null) { + mVirtualDeviceSession.start(); + } } } catch (Exception e) { CASLog.e(TAG, "handleStateChangeCmd failed. " + e.getMessage()); @@ -763,6 +781,20 @@ public class CloudPhoneImpl implements ICloudPhone { return mCASClient.sendTouchEvent(id, action, x, y, pressure, time, newOrientation, mDisplayHeight, mDisplayWidth); } + private void initVirtualDeviceSession() { + mVirtualDeviceSession = new VirtualDeviceSession(mContext); + mRingBufferVirtualDeviceIO = new RingBufferVirtualDeviceIO(); + mVirtualDeviceSession.setVirtualDeviceIoHook(mRingBufferVirtualDeviceIO); + mVirtualDevDataListener = new CloudPhoneVirtualDevDataListener() { + @Override + public void onRecvVirtualDevData(byte[] data, int length) { + if (mRingBufferVirtualDeviceIO != null) { + mRingBufferVirtualDeviceIO.fillData(data); + } + } + }; + } + public static class JNIState { public static final int JNI_INIT = 0; public static final int JNI_LIB_INITIALIZED = 1; diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/VirtualDeviceSession.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/VirtualDeviceSession.java index a4ff95eaef3871ac06226f7ca0877503bde4ee2a..a36a03c8225104052accafcaf34b6f5664c447c3 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/VirtualDeviceSession.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/VirtualDeviceSession.java @@ -28,6 +28,7 @@ public class VirtualDeviceSession { Context mContext; ParamBundle mParamBundle; IVirtualDeviceIO mVirtualDeviceIO; + final Object mLock = new Object(); public VirtualDeviceSession(Context context) { mParamBundle = new ParamBundle(); @@ -44,14 +45,18 @@ public class VirtualDeviceSession { } public void start() { - mVirtualDevice = new VirtualDeviceProtocol(mVirtualDeviceIO, mContext); - mVirtualDevice.startProcess(); + synchronized (mLock) { + mVirtualDevice = new VirtualDeviceProtocol(mVirtualDeviceIO, mContext); + mVirtualDevice.startProcess(); + } } public void stop() { - if (mVirtualDevice != null) { - mVirtualDevice.stopProcess(); - mVirtualDevice = null; + synchronized (mLock) { + if (mVirtualDevice != null) { + mVirtualDevice.stopProcess(); + mVirtualDevice = null; + } } } }