From 722ac6f8a02e9a3d15341365a561f97f76b0fb2a Mon Sep 17 00:00:00 2001 From: wangshuo <584363327@qq.com> Date: Mon, 9 Oct 2023 17:14:17 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=80=E5=87=BA?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E7=BC=A9=E7=9F=AD=E8=80=97=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloudapp/ui/CasCloudDebugActivity.java | 16 ------ .../cloudapp/ui/CasCloudMainActivity.java | 17 ------ .../cloudapp/ui/CasCloudPhoneActivity.java | 54 ++++++++++--------- cloudphone/src/main/cpp/CasController.cpp | 1 - .../huawei/cloudphone/api/ICloudPhone.java | 7 +++ .../cloudphone/apiimpl/CloudPhoneImpl.java | 11 ++-- .../common/VirtualDeviceProtocol.java | 8 +-- 7 files changed, 46 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java index 581ad38..a5a1f5f 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudDebugActivity.java @@ -53,15 +53,6 @@ public class CasCloudDebugActivity extends Activity { private AutoCompleteTextView mCloudPhonePort; private TagFlowLayout mFlowLayout; private CasRecord mCasRecord; - private Button appConnect; - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed")) { - appConnect.setEnabled(true); - } - } - }; @Override protected void onCreate(Bundle savedInstanceState) { @@ -78,14 +69,11 @@ public class CasCloudDebugActivity extends Activity { initAutoCompleteTextView("ip", mCloudPhoneIp); initAutoCompleteTextView("port", mCloudPhonePort); setAdapter(mFlowLayout); - registerReceiver(mBroadcastReceiver, - new IntentFilter("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed")); } @Override protected void onPause() { super.onPause(); - unregisterReceiver(mBroadcastReceiver); } private void initView() { @@ -95,7 +83,6 @@ public class CasCloudDebugActivity extends Activity { initAutoCompleteTextView("port", mCloudPhonePort); mFlowLayout = findViewById(R.id.flow); setAdapter(mFlowLayout); - appConnect = findViewById(R.id.cloud_phone_connect); } @@ -103,7 +90,6 @@ public class CasCloudDebugActivity extends Activity { if (CasCommonUtils.isFastClick()) { return; } - appConnect.setEnabled(false); startCloudPhoneActivity(CasCloudPhoneActivity.class); } @@ -111,13 +97,11 @@ public class CasCloudDebugActivity extends Activity { String phoneIp = mCloudPhoneIp.getText().toString().trim(); if (TextUtils.isEmpty(phoneIp)) { CASLog.e(TAG, "输入Ip为空"); - appConnect.setEnabled(true); return; } String phonePort = mCloudPhonePort.getText().toString().trim(); if (TextUtils.isEmpty(phonePort)) { CASLog.e(TAG, "输入Port为空"); - appConnect.setEnabled(true); return; } Intent intent = new Intent(CasCloudDebugActivity.this, cls); diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java index 820be03..93901c5 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java @@ -77,14 +77,6 @@ public class CasCloudMainActivity extends Activity { private boolean isLogin = false; private Button appConnect; private CasCommonDialog mDialog; - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed")) { - appConnect.setEnabled(true); - } - } - }; private Handler handler = new Handler() { @Override @@ -203,8 +195,6 @@ public class CasCloudMainActivity extends Activity { @Override protected void onResume() { super.onResume(); - registerReceiver(mBroadcastReceiver, - new IntentFilter("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed")); if (mUserInfo == null) { String[] usernameList = mCasRecord.getRecord(USERNAME, 1); if (usernameList != null && usernameList.length != 0) { @@ -220,7 +210,6 @@ public class CasCloudMainActivity extends Activity { @Override protected void onPause() { super.onPause(); - unregisterReceiver(mBroadcastReceiver); } @Override @@ -299,11 +288,5 @@ public class CasCloudMainActivity extends Activity { startActivity(intent); overridePendingTransition(0, 0); - if (cls == CasCloudPhoneActivity.class) { - appConnect.setEnabled(false); - } } - - - } \ No newline at end of file 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 855fc8c..bcb4dee 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -139,6 +139,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl private static final int MSG_SHOW_TRAIL_PLAY_TIMEOUT = 104; private static final int MSG_RECONNECT_FAILED = 105; private static final int MSG_GET_START_PARAM_RESPONSE = 106; + private static final int STATE_DEINIT = 1; private static CasCloudPhoneActivity gAcitivity = null; private static CasListener mCasListener = null; @@ -151,6 +152,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl private CasCommonDialog quitDialog; private CasCommonDialog mDialog; private CasRecord mCasRecord; + private Thread rttThread; //virtual devices VirtualDeviceSession mVirtualDeviceSession = null; @@ -182,6 +184,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl private boolean mIsDebugMode = false; private boolean mIsTrailPlayTimeout = false; private boolean mIsActivityBackground = false; + private boolean mIsStopCloudPhoneCalled = false; private volatile boolean mIsStartTaskRunning = false; private ICloudPhone mCloudPhone; @@ -437,14 +440,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl CASLog.i(TAG, "onDestroy"); keepScreenLongLight(this, false); super.onDestroy(); - try { - mCloudPhone.exitCloudPhone(); - mCloudPhone.deinit(); - } catch (Exception e) { - CASLog.e(TAG, "destroy failed. " + e.getMessage()); - } - Intent intent = new Intent("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed"); - sendBroadcast(intent); + stopCloudPhone(); } @Override @@ -821,28 +817,35 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl * stop cloud phone */ private void stopCloudPhone() { + if (mIsStopCloudPhoneCalled) { + return; + } CASLog.d(TAG, "stop cloud phone"); + mIsStopCloudPhoneCalled = true; + mProgressBar.setVisibility(View.VISIBLE); + mFrameLayout.setVisibility(View.GONE); doCheckConnection = false; // dismissAllDialogs(); - finish(); gAcitivity = null; if (mVirtualDeviceSession != null) { mVirtualDeviceSession.stop(); } - new Thread(new Runnable() { - @Override - public void run() { - bIsStart = false; - try { - mCloudPhone.exitCloudPhone(); - } catch (Exception e) { - CASLog.e(TAG, "stop cloud phone failed " + e.getMessage()); - } - if (mCasListener != null) { - mCasListener.onStateChange(CasState.CAS_EXIT, "Exit"); - } - } - }).start(); + rttThread.interrupt(); + bIsStart = false; + try { + mCloudPhone.exitCloudPhone(); + mCloudPhone.deinit(); + } catch (Exception e) { + CASLog.e(TAG, "stop cloud phone failed " + e.getMessage()); + } + if (mCasListener != null) { + mCasListener.onStateChange(CasState.CAS_EXIT, "Exit"); + } + + while (mCloudPhone.getState() != STATE_DEINIT) { + sleep(10); + } + finish(); } /** @@ -919,7 +922,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl bIsStart = true; rebuildDone = false; // monitor network - new Thread(new Runnable() { + rttThread = new Thread(new Runnable() { @Override public void run() { mIsStartTaskRunning = true; @@ -937,7 +940,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl CASLog.i(TAG, "startSuccessThreadTask out"); mIsStartTaskRunning = false; } - }).start(); + }); + rttThread.start(); } /** diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp index 75721b4..37e709a 100644 --- a/cloudphone/src/main/cpp/CasController.cpp +++ b/cloudphone/src/main/cpp/CasController.cpp @@ -265,7 +265,6 @@ bool CasController::Stop(bool isHome) ERR("Failed to send stop command."); } - usleep(200000); this->SetState(STOPPED); DestroyWorkers(); 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 5cf371a..c3044a4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java @@ -135,4 +135,11 @@ public interface ICloudPhone { * @return 网络时延 */ int getRtt(); + + /** + * 获取当前状态 + * + * @return 当前状态 + */ + int getState(); } 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 be01a76..1fbc6ff 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -241,8 +241,6 @@ public class CloudPhoneImpl implements ICloudPhone { mViewGroup = null; mAutoReconnectCount = 0; CASLog.i(TAG, "exitCloudPhone end..."); - Intent intent = new Intent("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed"); - mContext.sendBroadcast(intent); } } } @@ -326,6 +324,11 @@ public class CloudPhoneImpl implements ICloudPhone { } } + @Override + public int getState() { + return mCurrentState; + } + public void handleStartCmd(final Activity activity, final ViewGroup views) { if (null == activity) { CASLog.e(TAG, "handle start cmd fail, activity is null."); @@ -381,7 +384,7 @@ public class CloudPhoneImpl implements ICloudPhone { public void surfaceDestroyed(SurfaceHolder holder) { synchronized (mCloudPhoneLock) { CASLog.i(TAG, "surfaceDestroyed..."); - if (mCASClient.getState() != JNIState.JNI_STOPPED) { + if (mCASClient != null && mCASClient.getState() != JNIState.JNI_STOPPED) { mCASClient.stop(true); } if (mCmdHandler != null) { @@ -665,6 +668,8 @@ public class CloudPhoneImpl implements ICloudPhone { CASLog.e(TAG, "get orientation failed. " + e.getMessage()); return true; } + } else { + return false; } switch (orientation) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java index a421a05..f4bfb0b 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/common/VirtualDeviceProtocol.java @@ -96,11 +96,7 @@ public class VirtualDeviceProtocol { public void stopProcess() { mIsTaskRun = false; - try { - mPktProcessThread.join(); - } catch (InterruptedException e) { - Log.e(TAG, "stopProcess: failed to stop mPktProcessThread.", e); - } + mPktProcessThread.interrupt(); for (Map.Entry entry : virtualDeviceManagers.entrySet()) { entry.getValue().stop(); } @@ -138,7 +134,7 @@ public class VirtualDeviceProtocol { try { Thread.sleep(WAITING_INTERVAL); } catch (InterruptedException e) { - Log.e(TAG, "readN: sleep is interrupt", e); + Log.e(TAG, "readN: sleep is interrupt"); } } return readLen; -- Gitee From 5b29838edbb4d9a7d127935087bf13ea97cad8ff Mon Sep 17 00:00:00 2001 From: wangshuo <584363327@qq.com> Date: Tue, 10 Oct 2023 16:10:29 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=82=AC=E6=B5=AE?= =?UTF-8?q?=E7=90=83=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 3 ++ .../cloudapp/ui/CasCloudPhoneActivity.java | 51 ++++++++++++++++--- app/src/main/res/layout/cas_ctrl_view.xml | 41 ++++++++++----- app/src/main/res/values/strings.xml | 3 +- cloudphone/src/main/cpp/CasController.cpp | 4 +- .../cloudphone/apiimpl/CloudPhoneImpl.java | 11 +++- .../datacenter/CasRecvPktDispatcher.java | 2 +- 7 files changed, 92 insertions(+), 23 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b63641c..10fa95b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,6 +31,7 @@ @@ -41,12 +42,14 @@ 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 bcb4dee..abc99ce 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -16,6 +16,7 @@ package com.huawei.cloudapp.ui; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; @@ -32,8 +33,10 @@ import androidx.fragment.app.FragmentActivity; import android.util.DisplayMetrics; import android.util.Log; +import android.view.GestureDetector; import android.view.Gravity; import android.view.KeyEvent; +import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; @@ -187,6 +190,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl private boolean mIsStopCloudPhoneCalled = false; private volatile boolean mIsStartTaskRunning = false; private ICloudPhone mCloudPhone; + private GestureDetector mGestureDetector; RadioGroup.OnCheckedChangeListener qualityCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() { public void onCheckedChanged(RadioGroup group, int checkedId) { @@ -303,6 +307,41 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl build().toControl(this).show(); textCtrl = (TextView) findViewById(R.id.tv_ctrl); textCtrl.setOnClickListener(CasCloudPhoneActivity.this); + mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener(){ + @SuppressLint("RestrictedApi") + @Override + public boolean onDoubleTap(MotionEvent e) { + KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HOME); + dispatchKeyEvent(event); + event = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HOME); + dispatchKeyEvent(event); + return true; + } + + @Override + public boolean onDoubleTapEvent(MotionEvent e) { + return false; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + switchCtrlViewShow(); + return true; + } + + @SuppressLint("RestrictedApi") + @Override + public void onLongPress(MotionEvent e) { + KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_APP_SWITCH); + dispatchKeyEvent(event); + event = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_APP_SWITCH); + dispatchKeyEvent(event); + } + }); + textCtrl.setOnTouchListener((v, event) -> { + mGestureDetector.onTouchEvent(event); + return true; + }); textCtrl.setBackgroundResource(R.drawable.ctrl_view); setRotation(mOrientation); @@ -556,11 +595,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl break; case CasState.CAS_BACK_HOME: CASLog.i(TAG, "back home"); - if (textCtrl.getVisibility() == View.VISIBLE) { - showUiLevelDialog(); - } else { - textCtrl.callOnClick(); - } + switchCtrlViewShow(); break; default: break; @@ -830,7 +865,9 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl if (mVirtualDeviceSession != null) { mVirtualDeviceSession.stop(); } - rttThread.interrupt(); + if (rttThread != null) { + rttThread.interrupt(); + } bIsStart = false; try { mCloudPhone.exitCloudPhone(); @@ -972,7 +1009,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl if (id == R.id.tv_ctrl) { switchCtrlViewShow(); } else if (id == R.id.quit_cloud_phone) { - showUiLevelDialog(); + stopCloudPhone(); switchCtrlViewShow(); } else if (id == R.id.ctr_view) { switchCtrlViewShow(); diff --git a/app/src/main/res/layout/cas_ctrl_view.xml b/app/src/main/res/layout/cas_ctrl_view.xml index 7e25c08..cd26307 100644 --- a/app/src/main/res/layout/cas_ctrl_view.xml +++ b/app/src/main/res/layout/cas_ctrl_view.xml @@ -94,19 +94,36 @@ android:textSize="16sp" /> - + android:layout_height="wrap_content" + android:orientation="horizontal" > + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 016f920..a0916e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,7 +32,7 @@ 进入云手机 云手机port: 时延 - 显示CTRL + 显示悬浮球 编码类型: 软编 硬编 @@ -50,5 +50,6 @@ 获取手机列表失败 "登录失败" "登录失败,请检查用户名和账号" + "悬浮窗指引:长按多任务,双击返回桌面" #ff00ff \ No newline at end of file diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp index 37e709a..7f73b64 100644 --- a/cloudphone/src/main/cpp/CasController.cpp +++ b/cloudphone/src/main/cpp/CasController.cpp @@ -441,13 +441,15 @@ bool CasController::DestroyWorkers() } if (m_heartbeatThread != nullptr) { + if (m_heartbeatController != nullptr) { + m_heartbeatController->StopHandle(); + } m_heartbeatThread->Exit(); delete m_heartbeatThread; m_heartbeatThread = nullptr; } if (m_heartbeatController != nullptr) { - m_heartbeatController->StopHandle(); delete m_heartbeatController; m_heartbeatController = nullptr; } 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 1fbc6ff..0f355f4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -106,6 +106,7 @@ public class CloudPhoneImpl implements ICloudPhone { private int mCurrentState; private DisplayMode mDisplayMode = DISPLAY_MODE_FILL; private boolean mServiceConnect = false; + private boolean mIsSurfaceDestroyed = true; private Timer mBackGroundTimer = null; private int mAutoReconnectCount = 0; private Timer mAutoReconnectTimer = null; @@ -341,12 +342,19 @@ public class CloudPhoneImpl implements ICloudPhone { CASLog.i(TAG, "handleStartCmd start"); mCurrentState = STATE_STARTING; //创建SurfaceView + while (!mIsSurfaceDestroyed) { + try { + Thread.sleep(10); + } catch (InterruptedException e) { + CASLog.i(TAG, "sleep has been interrupt"); + } + } if (mDisplayMode == DISPLAY_MODE_FILL) { mSurfaceView = new PhoneView(activity, true); } else { mSurfaceView = new PhoneView(activity, false); } - + mIsSurfaceDestroyed = false; mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { @@ -392,6 +400,7 @@ public class CloudPhoneImpl implements ICloudPhone { msg.what = CMD_SURFACE_DESTROY; mCmdHandler.sendMessage(msg); } + mIsSurfaceDestroyed = true; } } }); diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/datacenter/CasRecvPktDispatcher.java b/cloudphone/src/main/java/com/huawei/cloudphone/datacenter/CasRecvPktDispatcher.java index 92aeb0f..1120b55 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/datacenter/CasRecvPktDispatcher.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/datacenter/CasRecvPktDispatcher.java @@ -43,7 +43,7 @@ public class CasRecvPktDispatcher { stopFlag = true; while (!stopped) { try { - Thread.sleep(100); + Thread.sleep(10); } catch (InterruptedException e) { CASLog.i(TAG, "sleep interrupted"); } -- Gitee From 0afbec959063f83d98601309cac91cadd835516a Mon Sep 17 00:00:00 2001 From: wangshuo <584363327@qq.com> Date: Tue, 10 Oct 2023 17:10:36 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=8A=A0=E9=94=81=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=9D=97=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/cas_ctrl_view.xml | 49 +-- app/src/main/res/values/strings.xml | 2 +- .../cloudphone/apiimpl/CloudPhoneImpl.java | 370 ++++++++++-------- 3 files changed, 237 insertions(+), 184 deletions(-) diff --git a/app/src/main/res/layout/cas_ctrl_view.xml b/app/src/main/res/layout/cas_ctrl_view.xml index cd26307..4b5a01e 100644 --- a/app/src/main/res/layout/cas_ctrl_view.xml +++ b/app/src/main/res/layout/cas_ctrl_view.xml @@ -94,36 +94,29 @@ android:textSize="16sp" /> - + - - - + android:layout_marginBottom="5dp" + android:layout_marginLeft="5dp" + android:alpha="0.8" + android:gravity="center" + android:text="@string/cas_ctrl_help" + android:textSize="10sp" + android:textColor="@color/cas_font_common_2"/> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0916e6..f52aea9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,6 +50,6 @@ 获取手机列表失败 "登录失败" "登录失败,请检查用户名和账号" - "悬浮窗指引:长按多任务,双击返回桌面" + "悬浮球指引:长按多任务,双击返回桌面" #ff00ff \ No newline at end of file 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 0f355f4..4cec3ed 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -217,31 +217,37 @@ public class CloudPhoneImpl implements ICloudPhone { public void exitCloudPhone() throws Exception { CASLog.i(TAG, "exitCloudPhone called"); synchronized (mCloudPhoneLock) { - if ((mCurrentState == STATE_START) || (mCurrentState == STATE_PAUSE) || (mCurrentState == STATE_STARTING)) { - CASLog.i(TAG, "exitCloudPhone begin..."); - mIsReconnectTaskRun = false; - if (mCheckConnectStateThread != null) { - mCheckConnectStateThread.interrupt(); - try { - mCheckConnectStateThread.join(); - } catch (InterruptedException e) { - CASLog.e(TAG, "exit cloud phone failed. " + e.getMessage()); + try { + if ((mCurrentState == STATE_START) || (mCurrentState == STATE_PAUSE) || (mCurrentState == STATE_STARTING)) { + CASLog.i(TAG, "exitCloudPhone begin..."); + mIsReconnectTaskRun = false; + if (mCheckConnectStateThread != null) { + mCheckConnectStateThread.interrupt(); + try { + mCheckConnectStateThread.join(); + } catch (InterruptedException e) { + CASLog.e(TAG, "exit cloud phone failed. " + e.getMessage()); + } + mCheckConnectStateThread = null; } - mCheckConnectStateThread = null; - } - if (mBackGroundTimer != null) { - mBackGroundTimer.cancel(); - mBackGroundTimer = null; + if (mBackGroundTimer != null) { + mBackGroundTimer.cancel(); + mBackGroundTimer = null; + } + mCASClient.stopJniRecv(); + mCASClient.stop(false); + mCmdHandler = null; + mCurrentState = STATE_INIT; + mSurfaceView = null; + mActivity = null; + mViewGroup = null; + mAutoReconnectCount = 0; + CASLog.i(TAG, "exitCloudPhone end..."); } - mCASClient.stopJniRecv(); - mCASClient.stop(false); - mCmdHandler = null; - mCurrentState = STATE_INIT; - mSurfaceView = null; - mActivity = null; - mViewGroup = null; - mAutoReconnectCount = 0; - CASLog.i(TAG, "exitCloudPhone end..."); + } catch (Exception e) { + CASLog.e(TAG, "exitCloudPhone failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } } } @@ -379,11 +385,17 @@ public class CloudPhoneImpl implements ICloudPhone { } mIsNewCreated = false; synchronized (mCloudPhoneLock) { - if (mCmdHandler != null) { - Message msg = new Message(); - msg.obj = holder; - msg.what = CMD_SURFACE_CREATE; - mCmdHandler.sendMessage(msg); + try { + if (mCmdHandler != null) { + Message msg = new Message(); + msg.obj = holder; + msg.what = CMD_SURFACE_CREATE; + mCmdHandler.sendMessage(msg); + } + } catch (Exception e) { + CASLog.e(TAG, "Send message failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } } } @@ -391,16 +403,22 @@ public class CloudPhoneImpl implements ICloudPhone { @Override public void surfaceDestroyed(SurfaceHolder holder) { synchronized (mCloudPhoneLock) { - CASLog.i(TAG, "surfaceDestroyed..."); - if (mCASClient != null && mCASClient.getState() != JNIState.JNI_STOPPED) { - mCASClient.stop(true); - } - if (mCmdHandler != null) { - Message msg = new Message(); - msg.what = CMD_SURFACE_DESTROY; - mCmdHandler.sendMessage(msg); + try { + CASLog.i(TAG, "surfaceDestroyed..."); + if (mCASClient != null && mCASClient.getState() != JNIState.JNI_STOPPED) { + mCASClient.stop(true); + } + if (mCmdHandler != null) { + Message msg = new Message(); + msg.what = CMD_SURFACE_DESTROY; + mCmdHandler.sendMessage(msg); + } + mIsSurfaceDestroyed = true; + } catch (Exception e) { + CASLog.e(TAG, "surfaceDestroyed failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } - mIsSurfaceDestroyed = true; } } }); @@ -509,108 +527,138 @@ public class CloudPhoneImpl implements ICloudPhone { private void handleSurfaceCreateCmd(Message msg) { synchronized (mCloudPhoneLock) { - mCASClient.setCasConnectorInfo(mConnectorInfo); - CASLog.i(TAG, "handleSurfaceCreateCmd mCurrentState = " + mCurrentState); - if (mCurrentState == STATE_STARTING) { - mCASClient.setSurface(mSurfaceView.getHolder().getSurface()); - mCASClient.startJniRecv(); - if (mCASClient.start(false)) { - mIsReconnectTaskRun = true; - mCheckConnectStateThread = new CheckConnectStateThread(); - mCheckConnectStateThread.start(); - } - mCASClient.mute(mIsMute); - mCurrentState = STATE_START; - } else if (mCurrentState == STATE_PAUSE) { - mCASClient.setSurface(mSurfaceView.getHolder().getSurface()); - mCASClient.startJniRecv(); - mCASClient.start(true); - mCurrentState = STATE_START; - if (mBackGroundTimer != null) { - mBackGroundTimer.cancel(); - mBackGroundTimer = null; + try { + mCASClient.setCasConnectorInfo(mConnectorInfo); + CASLog.i(TAG, "handleSurfaceCreateCmd mCurrentState = " + mCurrentState); + if (mCurrentState == STATE_STARTING) { + mCASClient.setSurface(mSurfaceView.getHolder().getSurface()); + mCASClient.startJniRecv(); + if (mCASClient.start(false)) { + mIsReconnectTaskRun = true; + mCheckConnectStateThread = new CheckConnectStateThread(); + mCheckConnectStateThread.start(); + } + mCASClient.mute(mIsMute); + mCurrentState = STATE_START; + } else if (mCurrentState == STATE_PAUSE) { + mCASClient.setSurface(mSurfaceView.getHolder().getSurface()); + mCASClient.startJniRecv(); + mCASClient.start(true); + mCurrentState = STATE_START; + if (mBackGroundTimer != null) { + mBackGroundTimer.cancel(); + mBackGroundTimer = null; + } + } else { + CASLog.e(TAG, "mCurrentState = " + mCurrentState); } - } else { - CASLog.e(TAG, "mCurrentState = " + mCurrentState); + CASLog.i(TAG, "handleSurfaceCreateCmd end"); + } catch (Exception e) { + CASLog.e(TAG, "handleSurfaceCreateCmd failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } - CASLog.i(TAG, "handleSurfaceCreateCmd end"); } } private void handleSurfaceDestroyCmd() { synchronized (mCloudPhoneLock) { - if (mCurrentState == STATE_START) { - CASLog.i(TAG, "handleSurfaceDestroyCmd end"); - mCASClient.pause(); - mCurrentState = STATE_PAUSE; - mBackGroundTimer = new Timer(); - mBackGroundTimer.schedule(new BackgroundTimerTask(), mBgTimeout); + try { + if (mCurrentState == STATE_START) { + CASLog.i(TAG, "handleSurfaceDestroyCmd end"); + mCASClient.pause(); + mCurrentState = STATE_PAUSE; + mBackGroundTimer = new Timer(); + mBackGroundTimer.schedule(new BackgroundTimerTask(), mBgTimeout); + } + } catch (Exception e) { + CASLog.e(TAG, "handleSurfaceDestroyCmd failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } } } private void handleSetMediaConfigCmd(Message msg) { synchronized (mCloudPhoneLock) { - HashMap mediaConfig = (HashMap) msg.obj; - CasParcelableMap parcelableMap = new CasParcelableMap(); - parcelableMap.setParcelableMap(mediaConfig); - mCASClient.setMediaConfig(parcelableMap); + try { + HashMap mediaConfig = (HashMap) msg.obj; + CasParcelableMap parcelableMap = new CasParcelableMap(); + parcelableMap.setParcelableMap(mediaConfig); + mCASClient.setMediaConfig(parcelableMap); + } catch (Exception e) { + CASLog.e(TAG, "handleSetMediaConfigCmd failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); + } } } private void handleStateChangeCmd(Message msg) { //当cae返回如下这些状态时,sdk主动发起stop synchronized (mCloudPhoneLock) { - int state = msg.arg1; - if (state == CasState.CAS_BACKGROUND_TIMEOUT - || state == CasState.CAS_NOTOUCH_TIMEOUT - || state == CasState.CAS_TRAIL_PLAY_TIMEOUT - || state == CasState.CAS_VERIFY_FAILED - || state == CasState.CAS_VERIFY_DECRYPT_FAILED - || state == CasState.CAS_VERIFY_AESKEY_INVALID - || state == CasState.CAS_VERIFY_AESKEY_QUERY_FAILED - || state == CasState.CAS_VERIFY_PARAMETER_INVALID - || state == CasState.CAS_VERIFY_PARAMETER_MISSING - || state == CasState.CAS_CONNECT_LOST) { - if (mCurrentState == STATE_START - || mCurrentState == STATE_PAUSE - || mCurrentState == STATE_STARTING) { - if (mCheckConnectStateThread != null) { - mIsReconnectTaskRun = false; - mCheckConnectStateThread.interrupt(); - mCheckConnectStateThread = null; + try { + int state = msg.arg1; + if (state == CasState.CAS_BACKGROUND_TIMEOUT + || state == CasState.CAS_NOTOUCH_TIMEOUT + || state == CasState.CAS_TRAIL_PLAY_TIMEOUT + || state == CasState.CAS_VERIFY_FAILED + || state == CasState.CAS_VERIFY_DECRYPT_FAILED + || state == CasState.CAS_VERIFY_AESKEY_INVALID + || state == CasState.CAS_VERIFY_AESKEY_QUERY_FAILED + || state == CasState.CAS_VERIFY_PARAMETER_INVALID + || state == CasState.CAS_VERIFY_PARAMETER_MISSING + || state == CasState.CAS_CONNECT_LOST) { + if (mCurrentState == STATE_START + || mCurrentState == STATE_PAUSE + || mCurrentState == STATE_STARTING) { + if (mCheckConnectStateThread != null) { + mIsReconnectTaskRun = false; + mCheckConnectStateThread.interrupt(); + mCheckConnectStateThread = null; + } + mCASClient.stopJniRecv(); + mCASClient.stop(false); } - mCASClient.stopJniRecv(); - mCASClient.stop(false); + } else if (state == CasState.CAS_START_SUCCESS) { + mIsStartSuccess = true; } - } else if (state == CasState.CAS_START_SUCCESS) { - mIsStartSuccess = true; + } catch (Exception e) { + CASLog.e(TAG, "handleStateChangeCmd failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } } } private void handleBackgroundTimeoutCmd() { synchronized (mCloudPhoneLock) { - if (mCurrentState == STATE_PAUSE) { - if (mCheckConnectStateThread != null) { - mIsReconnectTaskRun = false; - try { - mCheckConnectStateThread.join(); - } catch (InterruptedException e) { - CASLog.e(TAG, "handle background timeout failed. " + e.getMessage()); + try { + if (mCurrentState == STATE_PAUSE) { + if (mCheckConnectStateThread != null) { + mIsReconnectTaskRun = false; + try { + mCheckConnectStateThread.join(); + } catch (InterruptedException e) { + CASLog.e(TAG, "handle background timeout failed. " + e.getMessage()); + } + mCheckConnectStateThread = null; + } + mCASClient.stopJniRecv(); + mCASClient.stop(false); + mCurrentState = STATE_INIT; + mSurfaceView = null; + mActivity = null; + mViewGroup = null; + if (mStateListener != null) { + mStateListener.onNotify(CasState.CAS_BACKGROUND_TIMEOUT, + "Switch background timeout"); } - mCheckConnectStateThread = null; - } - mCASClient.stopJniRecv(); - mCASClient.stop(false); - mCurrentState = STATE_INIT; - mSurfaceView = null; - mActivity = null; - mViewGroup = null; - if (mStateListener != null) { - mStateListener.onNotify(CasState.CAS_BACKGROUND_TIMEOUT, - "Switch background timeout"); } + } catch (Exception e) { + CASLog.e(TAG, "handleStateChangeCmd failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } } } @@ -621,49 +669,55 @@ public class CloudPhoneImpl implements ICloudPhone { return; } synchronized (mCloudPhoneLock) { - if (mCurrentState == STATE_INIT || mCurrentState == STATE_PAUSE) { - return; - } - CASLog.i(TAG, "reconnect mAutoReconnectCount=" + mAutoReconnectCount); - mCASClient.stopJniRecv(); - if (mCASClient.reconnect()) { - int status = mCASClient.getState(); - if (status == JNIState.JNI_CONNECTED) { - mCASClient.startJniRecv(); - mAutoReconnectCount = 0; - mAutoReconnectTimer = null; - mReconnecting = false; + try { + if (mCurrentState == STATE_INIT || mCurrentState == STATE_PAUSE) { return; } - } - CASLog.i(TAG, "reconnect failed"); - mAutoReconnectCount++; - if (mAutoReconnectCount > 3) { - if (mStateListener != null) { - mStateListener.onNotify(CasState.CAS_CONNECT_LOST, "Connect lost"); - mAutoReconnectCount = 0; - return; + CASLog.i(TAG, "reconnect mAutoReconnectCount=" + mAutoReconnectCount); + mCASClient.stopJniRecv(); + if (mCASClient.reconnect()) { + int status = mCASClient.getState(); + if (status == JNIState.JNI_CONNECTED) { + mCASClient.startJniRecv(); + mAutoReconnectCount = 0; + mAutoReconnectTimer = null; + mReconnecting = false; + return; + } } + CASLog.i(TAG, "reconnect failed"); + mAutoReconnectCount++; + if (mAutoReconnectCount > 3) { + if (mStateListener != null) { + mStateListener.onNotify(CasState.CAS_CONNECT_LOST, "Connect lost"); + mAutoReconnectCount = 0; + return; + } + } + int time = 1; + switch (mAutoReconnectCount) { + case 1: + time = 1; + break; + case 2: + time = 3; + break; + case 3: + time = 5; + break; + default: + return; + } + if (mAutoReconnectTimer != null) { + mAutoReconnectTimer.cancel(); + } + mAutoReconnectTimer = new Timer(); + mAutoReconnectTimer.schedule(new ReconnectTimerTask(), (long) time * 1000); + } catch (Exception e) { + CASLog.e(TAG, "handleReconnectCmd failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } - int time = 1; - switch (mAutoReconnectCount) { - case 1: - time = 1; - break; - case 2: - time = 3; - break; - case 3: - time = 5; - break; - default: - return; - } - if (mAutoReconnectTimer != null) { - mAutoReconnectTimer.cancel(); - } - mAutoReconnectTimer = new Timer(); - mAutoReconnectTimer.schedule(new ReconnectTimerTask(), (long) time * 1000); } } @@ -821,13 +875,19 @@ public class CloudPhoneImpl implements ICloudPhone { private class BackgroundTimerTask extends TimerTask { @Override public void run() { - CASLog.i(TAG, "BackgroudTimerTask run"); + CASLog.i(TAG, "BackgroundTimerTask run"); synchronized (mCloudPhoneLock) { - if (mCmdHandler != null) { - Message msg = new Message(); - msg.what = CMD_BACKGROUND_TIMEOUT; - CASLog.i(TAG, "CMD_BACKGROUND_TIMEOUT send"); - mCmdHandler.sendMessage(msg); + try { + if (mCmdHandler != null) { + Message msg = new Message(); + msg.what = CMD_BACKGROUND_TIMEOUT; + CASLog.i(TAG, "CMD_BACKGROUND_TIMEOUT send"); + mCmdHandler.sendMessage(msg); + } + } catch (Exception e) { + CASLog.e(TAG, "BackgroundTimerTask run failed. " + e.getMessage()); + } finally { + mCloudPhoneLock.notifyAll(); } } } -- Gitee From 1db1eab1c8ef55b43a45aa16ed34882b14077448 Mon Sep 17 00:00:00 2001 From: wangshuo <584363327@qq.com> Date: Tue, 10 Oct 2023 19:21:27 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=BC=A9=E7=9F=AD=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 abc99ce..f74608b 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java @@ -880,7 +880,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl } while (mCloudPhone.getState() != STATE_DEINIT) { - sleep(10); + sleep(3); } finish(); } -- Gitee