diff --git a/app/build.gradle b/app/build.gradle
index 176191d02eac7936b4cc073148d764564702d954..0146823d1110c3b3bb25a6e07802727b94783785 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -73,5 +73,7 @@ dependencies {
implementation 'com.github.bumptech.glide:glide:4.13.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.14.0'
implementation 'com.hyman:flowlayout-lib:1.1.2'
+ implementation 'com.android.support:design:28.0.0'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx'
implementation project(':cloudphone')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 839ab18b2845cf6f14f778d82f3ebdb68fe37fd0..2421b1bd34793652cd0d049f811d93aa47aa5b8e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="com.huawei.cloudapp">
+
@@ -35,12 +36,18 @@
android:label="@string/cas_title_activity_fullscreen"
android:theme="@style/CasCloudAppMainActivityTheme"
android:windowSoftInputMode="adjustResize" />
+
+ android:process=":remote" />
\ No newline at end of file
diff --git a/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java b/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java
index d4cd222fa961b4cac8c658f01aa00fd015c37938..30746f2fc929bcc18b6905814552dd8a4e8b1c44 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java
+++ b/app/src/main/java/com/huawei/cloudapp/common/CasImageQualityManager.java
@@ -18,11 +18,9 @@ package com.huawei.cloudapp.common;
public class CasImageQualityManager {
- public static final int QUALITY_1080P = 1080;
- public static final int QUALITY_720P = 720;
- public static final int QUALITY_540P = 540;
- public static final int QUALITY_480P = 480;
- public static final int QUALITY_AUTO = 0;
+ public static final int QUALITY_BEST = 0;
+ public static final int QUALITY_MAIN = 1;
+ public static final int QUALITY_BASIC = 2;
private volatile static CasImageQualityManager manager = null;
private int imageQualityStatus = 0;
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 2fdeeac72b04714f4f93efb327993f864783374d..30392fad0c4dd01c0414fd6c3df490a7b8b581bd 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudMainActivity.java
@@ -16,15 +16,11 @@
package com.huawei.cloudapp.ui;
-import static com.huawei.cloudapp.ui.CasCloudPhoneActivity.MEDIA_CONFIG;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.ENCODE_TYPE;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.FRAME_TYPE;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.REMOTE_SCHEDULING_ELB_IP;
-import static com.huawei.cloudapp.utils.CasConstantsUtil.REMOTE_SCHEDULING_ELB_PORT;
-
import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
+import android.content.IntentFilter;
import android.os.Bundle;
import android.text.InputFilter;
import android.text.Spanned;
@@ -33,9 +29,7 @@ import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.RadioGroup;
+import android.widget.Button;
import android.widget.TextView;
import com.huawei.cloudapp.R;
@@ -46,10 +40,7 @@ import com.zhy.view.flowlayout.FlowLayout;
import com.zhy.view.flowlayout.TagAdapter;
import com.zhy.view.flowlayout.TagFlowLayout;
-import java.io.Serializable;
import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
import java.util.UUID;
public class CasCloudMainActivity extends Activity {
@@ -57,16 +48,17 @@ public class CasCloudMainActivity extends Activity {
private static final String TAG = "CasCloudMainActivity";
private AutoCompleteTextView mCloudPhoneIp;
private AutoCompleteTextView mCloudPhonePort;
- private RadioGroup mEncodeTypeGroup;
- private int mEncodeType = 0;
- private String mFrameType = "h264";
- private LinearLayout mRemoteEncodeServerIpLayout;
- private LinearLayout mRemoteEncodeServerPortLayout;
- private EditText mRemoteEncodeServerIp;
- private EditText mRemoteEncodeServerPort;
- private RadioGroup mFrameTypeGroup;
private TagFlowLayout mFlowLayout;
private CasHistory mCasHistory;
+ 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) {
@@ -83,6 +75,14 @@ public class CasCloudMainActivity 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() {
@@ -90,63 +90,23 @@ public class CasCloudMainActivity extends Activity {
initAutoCompleteTextView("ip", mCloudPhoneIp);
mCloudPhonePort = findViewById(R.id.cloud_phone_port);
initAutoCompleteTextView("port", mCloudPhonePort);
- mEncodeTypeGroup = findViewById(R.id.encodeTypeRadioButtonGroup);
- mFrameTypeGroup = findViewById(R.id.frameTypeRadioButtonGroup);
- mRemoteEncodeServerIpLayout = findViewById(R.id.remote_ip_view_layout);
- mRemoteEncodeServerPortLayout = findViewById(R.id.remote_port_view_layout);
- mRemoteEncodeServerIp = findViewById(R.id.edit_text_remote_ip);
- mRemoteEncodeServerPort = findViewById(R.id.edit_text_remote_port);
mFlowLayout = findViewById(R.id.flow);
setAdapter(mFlowLayout);
+ appConnect = findViewById(R.id.cloud_phone_connect);
- mEncodeTypeGroup.check(R.id.radioButtonCpu);
- mEncodeTypeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(RadioGroup radioGroup, int i) {
- switch (i) {
- case R.id.radioButtonCpu:
- mEncodeType = 1;
- mRemoteEncodeServerIpLayout.setVisibility(View.GONE);
- mRemoteEncodeServerPortLayout.setVisibility(View.GONE);
- mRemoteEncodeServerIp.setText("");
- mRemoteEncodeServerPort.setText("");
- break;
- case R.id.radioButtonGpu:
- mEncodeType = 2;
- mRemoteEncodeServerIpLayout.setVisibility(View.GONE);
- mRemoteEncodeServerPortLayout.setVisibility(View.GONE);
- mRemoteEncodeServerIp.setText("");
- mRemoteEncodeServerPort.setText("");
- break;
- case R.id.radioButtonRemote:
- mRemoteEncodeServerIpLayout.setVisibility(View.VISIBLE);
- mRemoteEncodeServerPortLayout.setVisibility(View.VISIBLE);
- break;
- default:
- mEncodeType = 0;
- mRemoteEncodeServerIpLayout.setVisibility(View.GONE);
- mRemoteEncodeServerPortLayout.setVisibility(View.GONE);
- mRemoteEncodeServerIp.setText("");
- mRemoteEncodeServerPort.setText("");
- break;
- }
- }
- });
-
- mFrameTypeGroup.check(R.id.radioButtonH264);
- mFrameTypeGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(RadioGroup radioGroup, int i) {
- if (i == R.id.radioButtonH265) {
- mFrameType = "h265";
- } else {
- mFrameType = "h264";
- }
- }
- });
}
public void cloudPhoneConnect(View view) {
+ startCloudPhoneActivity(CasCloudPhoneActivity.class);
+ appConnect.setEnabled(false);
+ }
+
+
+ public void cloudPhoneConnectWeb(View view) {
+ startCloudPhoneActivity(CasCloudPhoneWebActivity.class);
+ }
+
+ private void startCloudPhoneActivity(Class> cls) {
String phoneIp = mCloudPhoneIp.getText().toString().trim();
if (TextUtils.isEmpty(phoneIp)) {
CASLog.e(TAG, "输入Ip为空");
@@ -157,32 +117,11 @@ public class CasCloudMainActivity extends Activity {
CASLog.e(TAG, "输入Port为空");
return;
}
- String remoteEncodeServerIp = mRemoteEncodeServerIp.getText().toString().trim();
- String remoteEncodeServerPort = mRemoteEncodeServerPort.getText().toString().trim();
- if (mEncodeType == 3) {
- if (remoteEncodeServerIp.isEmpty() || remoteEncodeServerPort.isEmpty()) {
- CASLog.e(TAG, "远编服务器信息不全");
- return;
- }
- }
-
- startCloudPhoneActivity(phoneIp, phonePort, remoteEncodeServerIp, remoteEncodeServerPort);
- }
-
- private void startCloudPhoneActivity(String phoneIp, String phonePort, String remoteEncodeServerIp, String remoteEncodeServerPort) {
-
- Intent intent = new Intent(CasCloudMainActivity.this, CasCloudPhoneActivity.class);
+ Intent intent = new Intent(CasCloudMainActivity.this, cls);
CasConnectInfo connectorInfo = getCasConnectorInfo(phoneIp, phonePort);
- Map mediaConfig = new HashMap();
- mediaConfig.put(FRAME_TYPE, mFrameType);
- mediaConfig.put(ENCODE_TYPE, String.valueOf(mEncodeType));
- if (!remoteEncodeServerIp.isEmpty() && !remoteEncodeServerPort.isEmpty()) {
- mediaConfig.put(REMOTE_SCHEDULING_ELB_IP, remoteEncodeServerIp);
- mediaConfig.put(REMOTE_SCHEDULING_ELB_PORT, remoteEncodeServerPort);
- }
intent.putExtra(CasConnectInfo.BUNDLE_KEY, connectorInfo);
- intent.putExtra(MEDIA_CONFIG, (Serializable) mediaConfig);
startActivity(intent);
+ overridePendingTransition(0, 0);
}
private CasConnectInfo getCasConnectorInfo(String phoneIp, String phonePort) {
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 92b13625623d3af8d319223f2071951542d8660a..366cd2a9979e34aa76a8c6f70f82d9d1feb31468 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
@@ -16,7 +16,6 @@
package com.huawei.cloudapp.ui;
-import android.Manifest;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
@@ -29,11 +28,8 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
-import androidx.core.app.ActivityCompat;
-import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
-import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
@@ -48,6 +44,7 @@ import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
+import com.google.gson.Gson;
import com.huawei.cloudapp.BuildConfig;
import com.huawei.cloudapp.R;
import com.huawei.cloudapp.common.CASLog;
@@ -58,6 +55,7 @@ import com.huawei.cloudapp.common.CasImageQualityManager;
import com.huawei.cloudapp.common.CasListener;
import com.huawei.cloudapp.common.CasState;
import com.huawei.cloudapp.utils.CasAdaptPhoneUtils;
+import com.huawei.cloudapp.utils.CasQualityUtil;
import com.huawei.cloudphone.api.CloudAppDataListener;
import com.huawei.cloudphone.api.CloudPhoneManager;
import com.huawei.cloudphone.api.CloudPhoneOrientationChangeListener;
@@ -68,14 +66,13 @@ import com.huawei.cloudphone.api.ICloudPhone;
import com.huawei.cloudphone.virtualdevice.VirtualDeviceSession;
import com.huawei.cloudphone.virtualdevice.common.RingBufferVirtualDeviceIO;
+import java.net.BindException;
import java.util.HashMap;
-import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
import static android.os.SystemClock.sleep;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_480P;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_540P;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_720P;
-import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_AUTO;
+import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_MAIN;
+import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_BASIC;
+import static com.huawei.cloudapp.common.CasImageQualityManager.QUALITY_BEST;
import static com.huawei.cloudapp.utils.CasConstantsUtil.AES_KEY;
import static com.huawei.cloudapp.utils.CasConstantsUtil.AUTH_TS;
import static com.huawei.cloudapp.utils.CasConstantsUtil.AVAILABLE_PLAYTIME;
@@ -86,9 +83,19 @@ import static com.huawei.cloudapp.utils.CasConstantsUtil.SESSION_ID;
import static com.huawei.cloudapp.utils.CasConstantsUtil.TICKET;
import static com.huawei.cloudapp.utils.CasConstantsUtil.TOUCH_TIMEOUT;
import static com.huawei.cloudapp.utils.CasConstantsUtil.USER_ID;
+import static com.huawei.cloudapp.utils.CasQualityUtil.DEFINITION_BEST;
+import static com.huawei.cloudapp.utils.CasQualityUtil.DEFINITION_MAIN;
+import static com.huawei.cloudapp.utils.CasQualityUtil.DEFINITION_BASIC;
+import static com.huawei.cloudapp.utils.CasQualityUtil.FRAME_TYPE_H264;
+import static com.huawei.cloudapp.utils.CasQualityUtil.FRAME_TYPE_H265;
+import static com.huawei.cloudapp.utils.CasQualityUtil.RESOLUTION_1080P;
import static com.huawei.cloudphone.api.CloudPhoneParas.DevType.DEV_PHONE;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.BITRATE;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.FRAME_TYPE;
import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_HEIGHT;
import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_WIDTH;
+import static com.huawei.cloudphone.utils.CasConstantsUtil.WIDTH;
+import static com.huawei.cloudphone.utils.CasMediaUtils.isSupportH265;
import static com.huawei.cloudphone.virtualdevice.camera.VirtualCameraManager.GRANT_CAMERA_PERMISSION_SUCCESS_ACTION;
import static com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager.DEV_TYPE_CAMERA;
import static com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager.DEV_TYPE_MICROPHONE;
@@ -125,7 +132,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
public volatile boolean rebuildDone = false;
public boolean doCheckConnection = false;
private int mDevType;
- private HashMap mediaConfig = null;
+ private HashMap mMediaConfig = null;
private ImageView loadingView = null;
private int currentRotation = -1;
private CasCommonDialog quitDialog;
@@ -147,13 +154,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
// intent trans value
private CasConnectInfo connectInfo;
private RadioGroup qualityRadioViewGroup;
- private RadioButton radioView720p;
- private RadioButton radioView540p;
- private RadioButton radioView480p;
- private RadioButton radioViewAuto;
+ private RadioButton radioViewBest;
+ 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;
private int mDisplayMode;
private FrameLayout mFrameLayout = null;
private FrameLayout mFloatContainer = null;
@@ -167,27 +175,17 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
if (group.getCheckedRadioButtonId() != checkedId) {
CASLog.e("CasMainActivity", "group.getCheckedRadioButtonId() != checkedId");
} else {
- int selectType = QUALITY_720P;
- String virtualWidth = "720";
- String virtualHeight = "1280";
- if (radioView720p.getId() == checkedId) {
- selectType = QUALITY_720P;
- virtualWidth = "720";
- virtualHeight = "1280";
- } else if (radioView540p.getId() == checkedId) {
- selectType = QUALITY_540P;
-
- // 音视频层规范要求虚拟宽高为8的倍数
- virtualWidth = "544";
- virtualHeight = "960";
- } else if (radioView480p.getId() == checkedId) {
- selectType = QUALITY_480P;
- virtualWidth = "480";
- virtualHeight = "640";
- } else if (radioViewAuto.getId() == checkedId) {
- selectType = QUALITY_AUTO;
- virtualWidth = "720";
- virtualHeight = "1280";
+ int selectType = QUALITY_BEST;
+ String[] quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_BEST);
+ if (radioViewBest.getId() == checkedId) {
+ selectType = QUALITY_BEST;
+ quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_BEST);
+ } else if (radioViewMain.getId() == checkedId) {
+ selectType = QUALITY_MAIN;
+ quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_MAIN);
+ } else if (radioViewBasic.getId() == checkedId) {
+ selectType = QUALITY_BASIC;
+ quality = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_BASIC);
}
int oldSelectType = CasImageQualityManager.getInstance().getImageQualityStatus();
@@ -195,8 +193,9 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CasImageQualityManager.getInstance().setImageQualityStatus(selectType);
checkImageQualityStatus(selectType);
HashMap config = new HashMap<>();
- config.put(VIRTUAL_WIDTH, virtualWidth);
- config.put(VIRTUAL_HEIGHT, virtualHeight);
+ config.put(BITRATE, quality[0]);
+ config.put(VIRTUAL_WIDTH, quality[1]);
+ config.put(VIRTUAL_HEIGHT, quality[2]);
mCloudPhone.setMediaConfig(config);
}
if (ctrView != null && ctrView.getVisibility() == View.VISIBLE) {
@@ -220,7 +219,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
showDialog(getResources().getString(R.string.cas_phone_play_timeout_tip_message));
break;
case MSG_STATE_CHANGE:
- processStateChangeMsg(msg.arg1);
+ processStateChangeMsg(msg.arg1, (String) msg.obj);
break;
case MSG_RECONNECT_FAILED:
showDialog(getResources().getString(R.string.cas_phone_reconnect_server_fail_tip_message));
@@ -271,10 +270,10 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mQuitCloudPhone.setOnClickListener(CasCloudPhoneActivity.this);
// ctrlView
qualityRadioViewGroup = findViewById(R.id.pic_quality_choose_layout);
- radioView720p = findViewById(R.id.pic_quality_720p);
- radioView540p = findViewById(R.id.pic_quality_540p);
- radioView480p = findViewById(R.id.pic_quality_480p);
- radioViewAuto = findViewById(R.id.pic_quality_auto);
+ radioViewBest = findViewById(R.id.pic_quality_best);
+ radioViewMain = findViewById(R.id.pic_quality_main);
+ radioViewBasic = findViewById(R.id.pic_quality_basic);
+ qualityRadioViewGroup.check(radioViewMain.getId());
qualityRadioViewGroup.setOnCheckedChangeListener(qualityCheckedChangeListener);
setRotation(mOrientation);
@@ -283,7 +282,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
try {
mCloudPhone = CloudPhoneManager.createCloudPhoneInstance();
mCloudPhone.setDisplayMode(CloudPhoneParas.DisplayMode.DISPLAY_MODE_FILL);
- mCloudPhone.init(this, DEV_PHONE);
HashMap parasMap = new HashMap();
parasMap.put(IP, connectInfo.getConnectIp());
@@ -296,6 +294,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
parasMap.put(AVAILABLE_PLAYTIME, connectInfo.getAvailablePlayTime());
parasMap.put(USER_ID, connectInfo.getUserId());
parasMap.put(TOUCH_TIMEOUT, connectInfo.getTouchTimeout());
+
+ mCloudPhone.init(this, DEV_PHONE, parasMap);
mCloudPhone.registerCloudPhoneStateListener(new CloudPhoneStateListenerImpl());
mCloudPhone.registerOnOrientationChangeListener(new CloudPhoneOrientationListener());
mCloudPhone.registerOnVirtualDevDataListener(new CloudPhoneVirtualDevDataListenerImpl());
@@ -305,16 +305,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CASLog.i(TAG, "onRecvCloudAppData, data size: %d", data.length);
}
});
-
- if (mediaConfig != null && mediaConfig.size() != 0) {
- mCloudPhone.setMediaConfig(mediaConfig);
- }
-
- mCloudPhone.startCloudPhone(this, mFrameLayout, parasMap);
} catch (IllegalArgumentException e) {
showDialog(getResources().getString(R.string.cas_phone_input_param_invalid));
+ } catch (IllegalStateException e) {
+ showDialog(getResources().getString(R.string.cas_phone_init_state_error_tip_message));
+ } catch (BindException | RuntimeException e) {
+ showDialog(getResources().getString(R.string.cas_phone_init_failed_tip_message));
} catch (Exception e) {
- CASLog.e(TAG, "startCloudApp start failed." + e.getMessage());
+ CASLog.e(TAG, "startCloudApp verify failed." + e.getMessage());
showDialog(getResources().getString(R.string.cas_phone_start_fail_tip_message));
}
}
@@ -392,6 +390,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
} catch (Exception e) {
CASLog.e(TAG, "destroy failed. " + e.getMessage());
}
+ Intent intent = new Intent("com.huawei.cloudapp.ui.CasCloudPhoneActivity.destroyed");
+ sendBroadcast(intent);
}
@Override
@@ -420,7 +420,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mOrientation = bundle.getInt(ORIENTATION);
mDisplayMode = bundle.getInt(DISPLAY_MODE);
mDevType = bundle.getInt(DEV_TYPE);
- mediaConfig = (HashMap) bundle.getSerializable(MEDIA_CONFIG);
+ mMediaConfig = (HashMap) bundle.getSerializable(MEDIA_CONFIG);
}
}
@@ -431,7 +431,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mVirtualDeviceSession.setVirtualDeviceIoHook(mRingBufferVirtualDeviceIO);
}
- private void processStateChangeMsg(int code) {
+ private void processStateChangeMsg(int code, String msg) {
CASLog.i(TAG, "processStateChangeMsg code = " + code);
switch (code) {
case CasState.CAS_START_SUCCESS:
@@ -491,11 +491,48 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
case CasState.CAS_NOTOUCH_TIMEOUT:
showDialog(getResources().getString(R.string.cas_notouch_timeout_tip_message));
break;
+ case CasState.CAS_VERIFY_SUCCESS:
+ startCloudPhone(msg);
+ break;
default:
break;
}
}
+ private void startCloudPhone(String msg) {
+ if (mMediaConfig == null) {
+ mMediaConfig = new HashMap();
+ }
+
+ Gson gson = new Gson();
+ HashMap cloudMediaConfig = gson.fromJson(msg, new HashMap().getClass());
+ mResolution = String.valueOf(((Double) cloudMediaConfig.get(WIDTH)).intValue());
+ mFrameType = (String) cloudMediaConfig.get(FRAME_TYPE);
+ CASLog.i(TAG, "mResolution = " + mResolution + ", mFrameType = " + mFrameType);
+ if (mResolution.equals(RESOLUTION_1080P)) {
+ radioViewBest.setText(R.string.quality_UHD);
+ radioViewMain.setText(R.string.quality_HD);
+ radioViewBasic.setText(R.string.quality_SD);
+ }
+ String[] qualityStr = CasQualityUtil.GetQuality(mFrameType, mResolution, DEFINITION_MAIN);
+
+ mMediaConfig.put(BITRATE, qualityStr[0]);
+ mMediaConfig.put(VIRTUAL_WIDTH, qualityStr[1]);
+ mMediaConfig.put(VIRTUAL_HEIGHT, qualityStr[2]);
+ if (!isSupportH265()) {
+ mFrameType = FRAME_TYPE_H264;
+ }
+ mMediaConfig.put(FRAME_TYPE, mFrameType);
+ mCloudPhone.setMediaConfig(mMediaConfig);
+
+ try {
+ mCloudPhone.startCloudPhone(this, mFrameLayout);
+ } catch (Exception e) {
+ CASLog.e(TAG, "startCloudApp start failed." + e.getMessage());
+ showDialog(getResources().getString(R.string.cas_phone_start_fail_tip_message));
+ }
+ }
+
/**
* set full screen display
*/
@@ -572,17 +609,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
*/
private void checkImageQualityStatus(int selectType) {
switch (selectType) {
- case QUALITY_AUTO:
- radioViewAuto.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
- break;
- case QUALITY_480P:
- radioView480p.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
+ case QUALITY_BASIC:
+ radioViewBasic.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
break;
- case QUALITY_540P:
- radioView540p.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
+ case QUALITY_MAIN:
+ radioViewMain.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
break;
- case QUALITY_720P:
- radioView720p.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
+ case QUALITY_BEST:
+ radioViewBest.setTextColor(this.getResources().getColor(R.color.cas_colorAccent));
break;
default:
break;
@@ -594,17 +628,14 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
*/
private void resumeImageQualityStatus(int selectType) {
switch (selectType) {
- case QUALITY_AUTO:
- radioViewAuto.setTextColor(this.getResources().getColor(R.color.cas_white));
- break;
- case QUALITY_480P:
- radioView480p.setTextColor(this.getResources().getColor(R.color.cas_white));
+ case QUALITY_BASIC:
+ radioViewBasic.setTextColor(this.getResources().getColor(R.color.cas_white));
break;
- case QUALITY_540P:
- radioView540p.setTextColor(this.getResources().getColor(R.color.cas_white));
+ case QUALITY_MAIN:
+ radioViewMain.setTextColor(this.getResources().getColor(R.color.cas_white));
break;
- case QUALITY_720P:
- radioView720p.setTextColor(this.getResources().getColor(R.color.cas_white));
+ case QUALITY_BEST:
+ radioViewBest.setTextColor(this.getResources().getColor(R.color.cas_white));
break;
default:
break;
@@ -648,18 +679,17 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CASLog.d(TAG, "stop cloud phone");
doCheckConnection = false; //
dismissAllDialogs();
- setResult(RESULT_OK);
finish();
gAcitivity = null;
+ if (mVirtualDeviceSession != null) {
+ mVirtualDeviceSession.stop();
+ }
new Thread(new Runnable() {
@Override
public void run() {
bIsStart = false;
try {
mCloudPhone.exitCloudPhone();
- if (mVirtualDeviceSession != null) {
- mVirtualDeviceSession.stop();
- }
} catch (Exception e) {
CASLog.e(TAG, "stop cloud phone failed " + e.getMessage());
}
@@ -819,6 +849,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
Message message = new Message();
message.what = MSG_STATE_CHANGE;
message.arg1 = code;
+ message.obj = msg;
handler.sendMessage(message);
if (mCasListener != null) {
mCasListener.onStateChange(code, msg);
diff --git a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..301d3c7040418772747f84103c4597080df2db0f
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneWebActivity.java
@@ -0,0 +1,120 @@
+package com.huawei.cloudapp.ui;
+
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.webkit.JavascriptInterface;
+import android.webkit.WebSettings;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.huawei.cloudapp.R;
+import com.huawei.cloudapp.common.CASLog;
+import com.huawei.cloudapp.common.CasConnectInfo;
+import com.huawei.cloudapp.common.CasHistory;
+import com.just.agentweb.AgentWeb;
+import com.just.agentweb.DefaultWebClient;
+import com.just.agentweb.WebChromeClient;
+
+public class CasCloudPhoneWebActivity extends AppCompatActivity {
+ private static final String TAG = "CasCloudWebFragment";
+ private AgentWeb mAgentWeb;
+ private LinearLayout mLinearLayout;
+ private CasConnectInfo mConnectInfo;
+ public static String urlStr = "https://110.41.19.175:10086/index?"; //h5 sdk部署地址
+
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_cas_cloud_phone_web);
+ getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
+ View.SYSTEM_UI_FLAG_FULLSCREEN);
+ mLinearLayout = findViewById(R.id.web_view);
+
+ mAgentWeb = AgentWeb.with(this)
+ .setAgentWebParent(mLinearLayout, -1, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT))
+ .useDefaultIndicator(-1, 3)
+ .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
+ .setWebViewClient(mWebViewClient)
+ .setWebChromeClient(mWebChromeClient)
+ .setMainFrameErrorView(R.layout.agentweb_error_page, -1)
+ .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.DISALLOW)
+ .interceptUnkownUrl()
+ .createAgentWeb()
+ .ready()
+ .go(getConnectUrl());
+ mAgentWeb.getWebCreator().getWebView().setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ mAgentWeb.getJsInterfaceHolder().addJavaObject("CasCallback", new CasCallbackInterface());
+ WebSettings webSettings = mAgentWeb.getWebCreator().getWebView().getSettings();
+ webSettings.setJavaScriptEnabled(true);
+ webSettings.setDomStorageEnabled(true);
+ webSettings.setMediaPlaybackRequiresUserGesture(false);
+ }
+
+ private com.just.agentweb.WebViewClient mWebViewClient = new com.just.agentweb.WebViewClient();
+ private WebChromeClient mWebChromeClient = new WebChromeClient() {
+ @Override
+ public void onShowCustomView(View view, CustomViewCallback customViewCallback) {
+ super.onShowCustomView(view, customViewCallback);
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+ }
+ };
+
+ @Override
+ public void onResume() {
+ if (mAgentWeb != null) {
+ mAgentWeb.getWebLifeCycle().onResume();
+ }
+ super.onResume();
+ }
+
+ @Override
+ public void onPause() {
+ if (mAgentWeb != null) {
+ mAgentWeb.getWebLifeCycle().onPause();
+ }
+ super.onPause();
+ }
+
+ @Override
+ public void onDestroy() {
+ if (mAgentWeb != null) {
+ mAgentWeb.getWebLifeCycle().onDestroy();
+ }
+ super.onDestroy();
+ }
+
+
+ /**
+ * get data with intent
+ */
+ private String getConnectUrl() {
+ CASLog.i(TAG, "getIntentData");
+ Intent intent = getIntent();
+ Bundle bundle = intent.getExtras();
+ if (bundle != null) {
+ mConnectInfo = intent.getParcelableExtra(CasConnectInfo.BUNDLE_KEY);
+ return urlStr + "ip=" + mConnectInfo.getConnectIp() + "&port=" + ((Integer.parseInt(mConnectInfo.getConnectPort()) + 1));
+ }
+ return null;
+ }
+
+ class CasCallbackInterface {
+ @JavascriptInterface
+ public void startSuccessCallback() {
+ CasHistory mCasHistory = new CasHistory(getSharedPreferences("input_history", MODE_PRIVATE));
+ mCasHistory.setHistory("ip", mConnectInfo.getConnectIp());
+ mCasHistory.setHistory("port", mConnectInfo.getConnectPort());
+ mCasHistory.setHistory("ip:port", mConnectInfo.getConnectIp() + ":" + mConnectInfo.getConnectPort());
+ }
+
+ @JavascriptInterface
+ public void exit() {
+ CasCloudPhoneWebActivity.this.finish();
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java b/app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..78a72ffc02c91bc7f7661237134e39d02351318d
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/utils/CasQualityUtil.java
@@ -0,0 +1,65 @@
+package com.huawei.cloudapp.utils;
+
+import java.util.HashMap;
+
+public class CasQualityUtil {
+
+ public static final String FRAME_TYPE_H265 = "h265";
+ public static final String FRAME_TYPE_H264 = "h264";
+
+ public static final String RESOLUTION_720P = "720";
+ public static final String RESOLUTION_1080P = "1080";
+
+ public static final String DEFINITION_BEST = "best";
+ public static final String DEFINITION_MAIN = "main";
+ public static final String DEFINITION_BASIC = "basic";
+
+ private static final String H264_720P_BEST = "2000000,720,1280";
+ private static final String H264_720P_MAIN = "1500000,720,1280";
+ private static final String H264_720P_BASIC = "1100000,544,960";
+
+ private static final String H264_1080P_BEST = "4000000,1080,1920";
+ private static final String H264_1080P_MAIN = "3000000,1080,1920";
+ private static final String H264_1080P_BASIC = "2200000,720,1280";
+
+ private static final String H265_720P_BEST = "1400000,720,1280";
+ private static final String H265_720P_MAIN = "1000000,720,1280";
+ private static final String H265_720P_BASIC = "800000,544,960";
+
+ private static final String H265_1080P_BEST = "2700000,1080,1920";
+ private static final String H265_1080P_MAIN = "2000000,1080,1920";
+ private static final String H265_1080P_BASIC = "1500000,720,1280";
+
+ private static HashMap>> quality =
+ new HashMap>>();
+
+ static {
+ quality.put(FRAME_TYPE_H264, new HashMap>());
+
+ quality.get(FRAME_TYPE_H264).put(RESOLUTION_720P, new HashMap());
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_720P).put(DEFINITION_BEST, H264_720P_BEST);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_720P).put(DEFINITION_MAIN, H264_720P_MAIN);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_720P).put(DEFINITION_BASIC, H264_720P_BASIC);
+
+ quality.get(FRAME_TYPE_H264).put(RESOLUTION_1080P, new HashMap());
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_1080P).put(DEFINITION_BEST, H264_1080P_BEST);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_1080P).put(DEFINITION_MAIN, H264_1080P_MAIN);
+ quality.get(FRAME_TYPE_H264).get(RESOLUTION_1080P).put(DEFINITION_BASIC, H264_1080P_BASIC);
+
+ quality.put(FRAME_TYPE_H265, new HashMap>());
+
+ quality.get(FRAME_TYPE_H265).put(RESOLUTION_720P, new HashMap());
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_720P).put(DEFINITION_BEST, H265_720P_BEST);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_720P).put(DEFINITION_MAIN, H265_720P_MAIN);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_720P).put(DEFINITION_BASIC, H265_720P_BASIC);
+
+ quality.get(FRAME_TYPE_H265).put(RESOLUTION_1080P, new HashMap());
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_1080P).put(DEFINITION_BEST, H265_1080P_BEST);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_1080P).put(DEFINITION_MAIN, H265_1080P_MAIN);
+ quality.get(FRAME_TYPE_H265).get(RESOLUTION_1080P).put(DEFINITION_BASIC, H265_1080P_BASIC);
+ }
+
+ public static String[] GetQuality(String frameType, String resolution, String definition) {
+ return quality.get(frameType).get(resolution).get(definition).split(",");
+ }
+}
diff --git a/app/src/main/res/layout/activity_cas_cloud_main.xml b/app/src/main/res/layout/activity_cas_cloud_main.xml
index 6dcf8df46f5033852f42e0c8dd8b4a12d97a288d..465e9d127e9ac31d3d9a07aeee348b78fe2559ad 100644
--- a/app/src/main/res/layout/activity_cas_cloud_main.xml
+++ b/app/src/main/res/layout/activity_cas_cloud_main.xml
@@ -65,150 +65,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/cas_ctrl_view.xml b/app/src/main/res/layout/cas_ctrl_view.xml
index 94064a8861867595f1631e4c069cf2c0b67d79e2..82531f737e440d982831f51ac9cabb6100e38cc7 100644
--- a/app/src/main/res/layout/cas_ctrl_view.xml
+++ b/app/src/main/res/layout/cas_ctrl_view.xml
@@ -20,48 +20,41 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
- android:orientation="vertical"
- android:paddingLeft="50dp"
- android:paddingRight="50dp">
+ android:orientation="horizontal"
+ android:paddingLeft="10dp"
+ android:paddingRight="10dp"
+ android:paddingTop="10dp"
+ android:paddingBottom="10dp">
-
-
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d4fc14e2ab41e58add2987bdb6b21749b62bcd5a..2a051e4d73295d1b961de620b0875cfb4226b9dc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,8 +25,11 @@
试玩时间已到
由于您长时间未操作游戏,服务断开
输入的参数不合法
+ 初始化状态错误,请重试
+ 初始化失败,请重试
云手机ip:
- 连接
+ APP连接
+ H5连接
云手机port:
关闭时延数据
显示时延数据
@@ -34,6 +37,10 @@
软编
硬编
远编
+ 超清
+ 高清
+ 标清
+ 流畅
编码服务器ip:
编码服务器port:
视频格式:
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 1699f81d411a214f07beabd63e2ff2a0a3c1677a..137f66304113205a3269146bc1188b86338f126a 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -12,6 +12,11 @@
- true
+
+
diff --git a/cloudphone/src/main/aidl/com/huawei/cloudphone/ICASAidlInterface.aidl b/cloudphone/src/main/aidl/com/huawei/cloudphone/ICASAidlInterface.aidl
index 21b9d451e151403692b9110c0b85524424bbf284..261e919328ec7cd5be955d518198e4708ce9e6c7 100644
--- a/cloudphone/src/main/aidl/com/huawei/cloudphone/ICASAidlInterface.aidl
+++ b/cloudphone/src/main/aidl/com/huawei/cloudphone/ICASAidlInterface.aidl
@@ -34,6 +34,8 @@ interface ICASAidlInterface {
void setSurface(in Surface suf);
+ boolean verify();
+
boolean start(in boolean isHome);
void stop(in boolean isHome);
diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp
index 2b4b25305b09d47c90565966b132d952ce4f3685..0fd0a3fcd87bf64c01246b33ab5721aa2c1fdb50 100644
--- a/cloudphone/src/main/cpp/CasController.cpp
+++ b/cloudphone/src/main/cpp/CasController.cpp
@@ -25,7 +25,7 @@
using namespace std;
const int BITRATE_MAX = 10000000;
-const int BITRATE_MIN = 1000000;
+const int BITRATE_MIN = 100000;
const int WIDTH_MAX = 4096;
const int WIDTH_MIN = 240;
const int HEIGHT_MAX = 4096;
@@ -118,23 +118,11 @@ void CasController::SetState(JNIState state)
this->m_state = state;
}
-bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
-{
- bool res = false;
- if (isHome && this->GetState() != STOPPED && m_casClientSocket->GetStatus() != SOCKET_STATUS_RUNNING) {
- res = Reconnect();
- if (res) {
- CreateDecWorker(nativeWindow, m_needVideoDecode);
- StartDecWorker(!m_retainVideoDecode);
- return true;
- } else {
- NotifyCommand(CAS_CONNECT_LOST, CasMsgCode::GetMsg(CAS_CONNECT_LOST));
- return false;
- }
- }
+bool CasController::verify() {
std::lock_guard lockGuard(this->m_lock);
- if (isHome) {
- return ProcessEnterForeground(nativeWindow);
+ if (this->GetState() == CONNECTED) {
+ INFO("Current state is CONNECTED. ");
+ return false;
}
if (this->GetState() == STOPPED) {
@@ -153,46 +141,92 @@ bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
m_clientType = CLIENT_TYPE;
m_maxDisconnectDuration = CalcMaxDisconnectDuration(m_conf.backgroundTimeout);
- std::string mediaConfigStr = "";
- if (IsValidMediaConfig(m_mediaConfig)) {
- mediaConfigStr = CasAppCtrlCmdUtils::MakeCommand(m_mediaConfig, SUB_COMMAND_SEPARATOR);
- }
- if (m_mediaConfig.find(KEY_FRAME_TYPE) != m_mediaConfig.end()) {
- m_frameType = m_mediaConfig[KEY_FRAME_TYPE] == "h264" ? FrameType::H264 : FrameType::H265;
+ bool res = InitDataStream();
+ if (!res) {
+ CloseDataStream();
+ return false;
}
- res = InitDataStream();
+ res = CreateWorkers();
if (!res) {
+ DestroyWorkers();
+ StopDecWorker(false);
CloseDataStream();
return false;
}
- res = CreateWorkers(nativeWindow, m_needVideoDecode);
+ res = BuildConnection();
if (!res) {
- DestroyWorkers(false);
+ ERR("Failed to build connection");
+ DestroyWorkers();
+ StopDecWorker(false);
+ CloseDataStream();
return false;
}
- res = BuildConnection();
+ StartWorkers();
+
+ std::string verifyCmd = CMD_VERIFY;
+ map parameters = { { KEY_COMMAND, verifyCmd },
+ { KEY_TICKET, m_ticket },
+ { KEY_AUTH_TS, m_authTs },
+ { KEY_VERIFY_DATA, m_verifyData },
+ { KEY_ENCRYPTED_DATA, m_encryptedData },
+ { KEY_SESSION_ID, m_sessionId },
+ { KEY_AES_IV, m_aesIv },
+ { KEY_SDK_VERSION, m_conf.sdkVersion },
+ { KEY_PROTOCOL_VERSION, m_conf.protocolVersion },
+ { KEY_CLIENT_TYPE, m_clientType },
+ { KEY_MAX_DISCONNECT_DURATION, m_maxDisconnectDuration } };
+
+ res = SendCommand(parameters);
if (!res) {
+ ERR("Failed to send verify command");
+ DestroyWorkers();
+ StopDecWorker(false);
+ CloseDataStream();
return false;
}
+ return true;
+}
- StartWorkers(!m_retainVideoDecode);
+bool CasController::Start(ANativeWindow *nativeWindow, bool isHome)
+{
+ m_nativeWindow = nativeWindow;
+ bool res = false;
+ if (isHome && this->GetState() != STOPPED && m_casClientSocket->GetStatus() != SOCKET_STATUS_RUNNING) {
+ res = Reconnect();
+ if (res) {
+ CreateDecWorker(m_nativeWindow, m_needVideoDecode);
+ StartDecWorker(!m_retainVideoDecode);
+ return true;
+ } else {
+ NotifyCommand(CAS_CONNECT_LOST, CasMsgCode::GetMsg(CAS_CONNECT_LOST));
+ return false;
+ }
+ }
+ std::lock_guard lockGuard(this->m_lock);
+ if (isHome) {
+ return ProcessEnterForeground(m_nativeWindow);
+ }
+
+ std::string mediaConfigStr = "";
+ if (IsValidMediaConfig(m_mediaConfig)) {
+ mediaConfigStr = CasAppCtrlCmdUtils::MakeCommand(m_mediaConfig, SUB_COMMAND_SEPARATOR);
+ }
+ if (m_mediaConfig.find(KEY_FRAME_TYPE) != m_mediaConfig.end()) {
+ m_frameType = m_mediaConfig[KEY_FRAME_TYPE] == "h264" ? FrameType::H264 : FrameType::H265;
+ }
+
+ NotifyCommand(CAS_CONNECT_SUCCESS, CasMsgCode::GetMsg(CAS_CONNECT_SUCCESS));
+ this->SetState(CONNECTED);
+
+ CreateDecWorker(m_nativeWindow, m_needVideoDecode);
+ StartDecWorker(!m_retainVideoDecode);
std::string startCmd = CMD_START_APP;
map parameters = { { KEY_COMMAND, startCmd },
- { KEY_TICKET, m_ticket },
- { KEY_AUTH_TS, m_authTs },
- { KEY_VERIFY_DATA, m_verifyData },
- { KEY_ENCRYPTED_DATA, m_encryptedData },
- { KEY_SESSION_ID, m_sessionId },
- { KEY_AES_IV, m_aesIv },
- { KEY_SDK_VERSION, m_conf.sdkVersion },
- { KEY_PROTOCOL_VERSION, m_conf.protocolVersion },
- { KEY_CLIENT_TYPE, m_clientType },
- { KEY_MEDIA_CONFIG, mediaConfigStr },
- { KEY_MAX_DISCONNECT_DURATION, m_maxDisconnectDuration } };
+ { KEY_MEDIA_CONFIG, mediaConfigStr }};
res = SendCommand(parameters);
if (!res) {
@@ -275,7 +309,8 @@ bool CasController::Stop(bool isHome)
usleep(200000);
this->SetState(STOPPED);
- DestroyWorkers(!m_retainVideoDecode);
+ DestroyWorkers();
+ StopDecWorker(!m_retainVideoDecode);
CloseDataStream();
m_isNotifyFirstFrame = false;
@@ -292,7 +327,8 @@ bool CasController::Release()
return false;
}
- DestroyWorkers(m_retainVideoDecode);
+ DestroyWorkers();
+ StopDecWorker(m_retainVideoDecode);
ClearDataStream();
return true;
}
@@ -311,9 +347,9 @@ bool CasController::Reconnect()
return false;
}
- res = CreateWorkers(nullptr, !m_needVideoDecode);
+ res = CreateWorkers();
if (!res) {
- DestroyWorkers(false);
+ DestroyWorkers();
return false;
}
@@ -342,11 +378,12 @@ bool CasController::Reconnect()
return false;
}
- StartWorkers(m_retainVideoDecode);
+ StartWorkers();
+ StartDecWorker(m_retainVideoDecode);
return true;
}
-bool CasController::CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDecode)
+bool CasController::CreateWorkers()
{
m_casClientSocket = new (std::nothrow) CasTcpClientSocket(m_ip, m_port);
if (m_casClientSocket == nullptr) {
@@ -406,15 +443,6 @@ bool CasController::CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDec
m_streamParser->SetServiceHandle(CasMsgType::Channel, m_channelStream);
m_streamParser->SetServiceHandle(CasMsgType::VirtualDevice, m_virtualDeviceStream);
- if (needVideoDecode) {
- m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType);
- if (m_videoDecodeThread == nullptr) {
- ERR("Failed to new video decode thread.");
- return false;
- }
- m_videoDecodeThread->SetDecodePktHandle(m_videoPacketStream);
- }
-
m_touch = new (std::nothrow) CasTouch(m_casClientSocket);
if (m_touch == nullptr) {
ERR("Failed to new touch.");
@@ -424,25 +452,16 @@ bool CasController::CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDec
return true;
}
-bool CasController::StartWorkers(bool retainVideoDecode)
+bool CasController::StartWorkers()
{
m_streamParseThread->Start();
-
- if (retainVideoDecode) {
- if (m_videoDecodeThread != nullptr) {
- m_videoDecodeThread->Restart();
- }
- } else {
- m_videoDecodeThread->Start();
- }
-
m_heartbeatThread->Start();
m_controlThread->Start();
INFO("Succeed to start workers");
return true;
}
-bool CasController::DestroyWorkers(bool retainVideoDecode)
+bool CasController::DestroyWorkers()
{
if (m_streamParseThread != nullptr) {
m_streamParseThread->Stop();
@@ -483,18 +502,6 @@ bool CasController::DestroyWorkers(bool retainVideoDecode)
m_cmdController = nullptr;
}
- if (retainVideoDecode) {
- if (m_videoDecodeThread != nullptr) {
- m_videoDecodeThread->Stop();
- }
- } else {
- if (m_videoDecodeThread != nullptr) {
- m_videoDecodeThread->Exit();
- delete m_videoDecodeThread;
- m_videoDecodeThread = nullptr;
- }
- }
-
if (m_streamBuildSender != nullptr) {
delete m_streamBuildSender;
m_streamBuildSender = nullptr;
@@ -522,8 +529,6 @@ bool CasController::BuildConnection()
NotifyCommand(CAS_RESOURCE_IN_USING, CasMsgCode::GetMsg(CAS_RESOURCE_IN_USING));
return false;
}
- NotifyCommand(CAS_CONNECT_SUCCESS, CasMsgCode::GetMsg(CAS_CONNECT_SUCCESS));
- this->SetState(CONNECTED);
return true;
}
@@ -850,6 +855,7 @@ bool CasController::CreateDecWorker(ANativeWindow *nativeWindow, bool needVideoD
if (needVideoDecode) {
m_videoDecodeThread = new (std::nothrow) CasVideoHDecodeThread(nativeWindow, m_frameType);
if (m_videoDecodeThread == nullptr) {
+ ERR("Failed to new video decode thread.");
return false;
}
m_videoDecodeThread->SetDecodePktHandle(m_videoPacketStream);
diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h
index 02b111d3c22a35edff790c46435d07e8c6e664be..0b2ad6c6df289961211184a408e88a4909ba409d 100644
--- a/cloudphone/src/main/cpp/CasController.h
+++ b/cloudphone/src/main/cpp/CasController.h
@@ -43,6 +43,8 @@ public:
~CasController();
+ bool verify();
+
bool Start(ANativeWindow *nativeWindow, bool isHome);
bool Stop(bool isHome);
@@ -81,11 +83,11 @@ public:
private:
bool Release();
- bool CreateWorkers(ANativeWindow *nativeWindow, bool needVideoDecode);
+ bool CreateWorkers();
- bool StartWorkers(bool retainVideoDecode);
+ bool StartWorkers();
- bool DestroyWorkers(bool retainVideoDecode);
+ bool DestroyWorkers();
bool CreateDecWorker(ANativeWindow *nativeWindow, bool needVideoDecode);
@@ -153,6 +155,7 @@ private:
std::string m_clientType;
std::string m_maxDisconnectDuration;
FrameType m_frameType;
+ ANativeWindow *m_nativeWindow;
unsigned int m_ip = 0;
unsigned short m_port = 0;
const bool m_retainVideoDecode = true;
diff --git a/cloudphone/src/main/cpp/CasJniBridge.cpp b/cloudphone/src/main/cpp/CasJniBridge.cpp
index 8c4afd104b5af1845488d2bd633147963b79bc22..6a3f4d54e10d31f4968fda4b4f04d10937ab6aca 100644
--- a/cloudphone/src/main/cpp/CasJniBridge.cpp
+++ b/cloudphone/src/main/cpp/CasJniBridge.cpp
@@ -52,6 +52,14 @@ static std::string jstring2string(JNIEnv *env, jstring jStr)
return ret;
}
+JNIEXPORT jboolean JNICALL JNI(verify)(JNIEnv *, jclass)
+{
+ if (gJniApiCtrl->verify()) {
+ return JNI_TRUE;
+ }
+ return JNI_FALSE;
+}
+
JNIEXPORT jboolean JNICALL JNI(start)(JNIEnv *env, jclass, jobject surface, jboolean isHome)
{
if (surface == nullptr) {
diff --git a/cloudphone/src/main/cpp/CasJniBridge.h b/cloudphone/src/main/cpp/CasJniBridge.h
index 47a4c8d78b5e081bef95cf070e2e09c6e05125f7..14bbc07c477f3bf8845354ea3ac6029a395255e0 100644
--- a/cloudphone/src/main/cpp/CasJniBridge.h
+++ b/cloudphone/src/main/cpp/CasJniBridge.h
@@ -26,6 +26,8 @@ JNIEXPORT jboolean JNICALL JNI(start)(JNIEnv *env, jclass, jobject surface, jboo
JNIEXPORT jboolean JNICALL JNI(reconnect)(JNIEnv *env, jclass);
+JNIEXPORT jboolean JNICALL JNI(verify)(JNIEnv *env, jclass);
+
JNIEXPORT void JNICALL JNI(stop)(JNIEnv *env, jclass, jboolean isHome);
JNIEXPORT jobject JNICALL JNI(getBitmap)(JNIEnv *env, jclass);
diff --git a/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h b/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
index 3495f6aab937338d064b6edda05eac6a879923e8..62f910dd035959cffb78c0899471bcfc9d2d6661 100644
--- a/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
+++ b/cloudphone/src/main/cpp/cas_service/CasAppCtrlCmdUtils.h
@@ -24,7 +24,8 @@ const std::string KEY_COMMAND = "command";
const std::string KEY_RESULT = "result";
const std::string KEY_CODE = "code";
const std::string KEY_MSG = "msg";
-const std::string CMD_HEARTBEAT_REQUEST = "0";
+const std::string KEY_HEARTBEAT = "heartbeat";
+const std::string CMD_VERIFY = "0";
const std::string CMD_START_APP = "1";
const std::string CMD_STOP_APP = "2";
const std::string CMD_RECONNECT = "3";
diff --git a/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp b/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
index 45dcaa9a6aa0edd82396e6505911a3a9764090ce..7bbb1104fa50d5796e721981ecfe14e9fac9726d 100644
--- a/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
+++ b/cloudphone/src/main/cpp/cas_service/CasHeartbeatController.cpp
@@ -60,9 +60,7 @@ bool CasHeartbeatController::HeartBeatRequest(int timeout)
{
std::lock_guard lockGuard(this->m_lock);
this->m_recvStream->Clear();
- map parameters = { { KEY_COMMAND, CMD_HEARTBEAT_REQUEST } };
- string msg = CasAppCtrlCmdUtils::MakeCommand(parameters);
- return Send(msg) && WaitResponse(CMD_HEARTBEAT_RESPONSE, timeout);
+ return Send(KEY_HEARTBEAT) && WaitResponse(CMD_HEARTBEAT_RESPONSE, timeout);
}
bool CasHeartbeatController::Send(string msg)
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 5cf371a09112b38286d00dd036e1a0b8f43165b5..394117e9fd07e10df7ad187bb5f320d110e99198 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java
@@ -40,8 +40,9 @@ public interface ICloudPhone {
*
* @param context 应用的上下文
* @param type TV/PHONE
+ * @param params 启动参数
*/
- void init(Context context, DevType type) throws Exception;
+ void init(Context context, DevType type, final Map params) throws Exception;
/**
* 反初始化SDK
@@ -52,10 +53,9 @@ public interface ICloudPhone {
* 启动云手机
*
* @param activity activity
- * @param view 手机画面渲染ViewGoup
- * @param params 启动参数
+ * @param view 手机画面渲染ViewGroup
*/
- void startCloudPhone(final Activity activity, final ViewGroup view, final Map params) throws Exception;
+ void startCloudPhone(final Activity activity, final ViewGroup view) throws Exception;
/**
* 停止云手机
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 c83f83f363320943068ff4c74ca69c49ec56a2b6..9e32c07f8543fc04c459b27b31b33703d7080e59 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
@@ -57,6 +57,7 @@ import com.huawei.cloudphone.common.CasState;
import com.huawei.cloudphone.service.CASClient;
import com.huawei.cloudphone.service.CASService;
+import java.net.BindException;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
@@ -65,7 +66,6 @@ import java.util.TimerTask;
import static android.view.KeyEvent.KEYCODE_BACK;
import static android.view.KeyEvent.KEYCODE_VOLUME_DOWN;
import static android.view.KeyEvent.KEYCODE_VOLUME_UP;
-import static android.view.KeyEvent.META_ALT_ON;
import static com.huawei.cloudphone.api.CloudPhoneParas.DisplayMode.DISPLAY_MODE_FILL;
import static com.huawei.cloudphone.common.CasState.CAS_CONNECT_EXCEPTION;
import static com.huawei.cloudphone.utils.CasMediaUtils.isValidMediaConfig;
@@ -83,6 +83,7 @@ public class CloudPhoneImpl implements ICloudPhone {
private static final int CMD_STOP = 1;
private static final int CMD_PAUSE = 2;
private static final int CMD_RESUME = 3;
+ private static final int CMD_VERIFY = 4;
private static final int CMD_SURFACE_CREATE = 11;
private static final int CMD_SURFACE_DESTROY = 12;
private static final int CMD_STATE_CHANGE = 14;
@@ -142,10 +143,11 @@ public class CloudPhoneImpl implements ICloudPhone {
}
@Override
- public void init(Context context, CloudPhoneParas.DevType type) {
+ public void init(Context context, CloudPhoneParas.DevType type, Map params) throws Exception {
CASLog.i(TAG, "init called mCurrentState = " + mCurrentState);
if (mCurrentState != STATE_DEINIT) {
- return;
+ CASLog.e(TAG, "Not ready for init. current state is " + mCurrentState);
+ throw new IllegalStateException("Not ready for init.");
}
mConnection = new CloudPhoneServiceConnection();
mCASClient = new CASClient();
@@ -156,17 +158,31 @@ public class CloudPhoneImpl implements ICloudPhone {
boolean ret = mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
if (!ret) {
CASLog.e(TAG, "Bind service failed.");
- return;
+ throw new BindException("Bind service failed.");
}
mCmdHandlerThread = new HandlerThread("cmd process");
if (mCmdHandlerThread == null) {
CASLog.e(TAG,"Create handler thread failed.");
- return;
+ throw new RuntimeException("Bind service failed.");
}
mCmdHandlerThread.start();
mCmdHandler = new CmdHandler(mCmdHandlerThread.getLooper());
mDevType = type;
mCurrentState = STATE_INIT;
+
+ mStartParas = params;
+ mConnectorInfo = new CasConnectorInfo();
+ if (!mConnectorInfo.initConnectorParams(mStartParas)) {
+ CASLog.e(TAG, "Init connector params failed.");
+ throw new IllegalArgumentException("Init connector params failed.");
+ }
+
+ CASLog.e(TAG, "ip = " + mConnectorInfo.getConnectIp() + ", port = " + mConnectorInfo.getConnectPort());
+ mBgTimeout = Integer.parseInt(mConnectorInfo.getBackgroundTimeout()) * 1000;
+
+ Message msg = new Message();
+ msg.what = CMD_VERIFY;
+ mCmdHandler.sendMessage(msg);
}
@Override
@@ -191,7 +207,7 @@ public class CloudPhoneImpl implements ICloudPhone {
}
@Override
- public void startCloudPhone(Activity activity, ViewGroup view, Map params) {
+ public void startCloudPhone(Activity activity, ViewGroup view) {
if (mCurrentState == STATE_DEINIT) {
CASLog.e(TAG, "Call init first.");
throw new IllegalStateException("Call init first.");
@@ -199,13 +215,6 @@ public class CloudPhoneImpl implements ICloudPhone {
CASLog.i(TAG, "startCloudPhone called");
mActivity = activity;
mViewGroup = view;
- mStartParas = params;
- mConnectorInfo = new CasConnectorInfo();
- if (!mConnectorInfo.initConnectorParams(mStartParas)) {
- CASLog.e(TAG, "Init connector params failed.");
- throw new IllegalArgumentException("Init connector params failed.");
- }
- mBgTimeout = Integer.parseInt(mConnectorInfo.getBackgroundTimeout()) * 1000;
mIsStartSuccess = false;
Message msg = new Message();
msg.what = CMD_START;
@@ -324,6 +333,19 @@ public class CloudPhoneImpl implements ICloudPhone {
}
}
+ private void handleVerifyCmd() {
+ if (mCurrentState != STATE_INIT) {
+ CASLog.e(TAG, "mCurrentState = " + mCurrentState);
+ return;
+ }
+ mCASClient.setCasConnectorInfo(mConnectorInfo);
+ if (!mCASClient.verify()) {
+ if (mStateListener != null) {
+ mStateListener.onNotify(CasState.CAS_VERIFY_FAILED, "Connect lost");
+ }
+ }
+ }
+
public void handleStartCmd(final Activity activity, final ViewGroup views) {
if (null == activity) {
CASLog.e(TAG, "handle start cmd fail, activity is null.");
@@ -494,7 +516,6 @@ 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());
@@ -715,6 +736,10 @@ public class CloudPhoneImpl implements ICloudPhone {
}
}
switch (msg.what) {
+ case CMD_VERIFY:
+ CASLog.i(TAG, "CMD_VERIFY");
+ handleVerifyCmd();
+ break;
case CMD_START:
CASLog.i(TAG, "CMD_START");
handleStartCmd(mActivity, mViewGroup);
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/jniwrapper/JNIWrapper.java b/cloudphone/src/main/java/com/huawei/cloudphone/jniwrapper/JNIWrapper.java
index ccf80ac4da73ba1dc62e37e38f8d975328651e78..f69568d566c0f2d4c8faadebe5b8adcfc20e02de 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/jniwrapper/JNIWrapper.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/jniwrapper/JNIWrapper.java
@@ -72,6 +72,8 @@ public class JNIWrapper {
public static native void setJniConf(String key, String value);
+ public static native boolean verify();
+
public static native boolean start(Surface surface, boolean isHome);
public static native void stop(boolean isHome);
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/service/CASClient.java b/cloudphone/src/main/java/com/huawei/cloudphone/service/CASClient.java
index 1bef8cda875dc655246e317844453d6f74e214fb..282e0f577417c9387deb8bc1b21cffd40b19d295 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/service/CASClient.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/service/CASClient.java
@@ -67,7 +67,7 @@ public class CASClient {
try {
mCasInterface.init();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call init");
+ CASLog.e(TAG, "failed to call init");
}
}
@@ -78,7 +78,7 @@ public class CASClient {
try {
mCasInterface.setEncryptData(encryptData);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call setEncryptData");
+ CASLog.e(TAG, "failed to call setEncryptData");
}
}
@@ -89,10 +89,24 @@ public class CASClient {
try {
mCasInterface.setSurface(suf);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call setSurface");
+ CASLog.e(TAG, "failed to call setSurface");
}
}
+ public boolean verify() {
+ if (mCasInterface == null) {
+ return false;
+ }
+ boolean ret;
+ try {
+ ret = mCasInterface.verify();
+ } catch (RemoteException e) {
+ CASLog.e(TAG, "failed to call verify");
+ ret = false;
+ }
+ return ret;
+ }
+
public boolean start(boolean isHome) {
if (mCasInterface == null) {
return false;
@@ -101,7 +115,7 @@ public class CASClient {
try {
ret = mCasInterface.start(isHome);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call start");
+ CASLog.e(TAG, "failed to call start");
ret = false;
}
return ret;
@@ -114,7 +128,7 @@ public class CASClient {
try {
mCasInterface.stop(isHome);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call stop");
+ CASLog.e(TAG, "failed to call stop");
}
}
@@ -125,7 +139,7 @@ public class CASClient {
try {
mCasInterface.pause();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call pause");
+ CASLog.e(TAG, "failed to call pause");
}
}
@@ -136,7 +150,7 @@ public class CASClient {
try {
mCasInterface.resume();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call resume");
+ CASLog.e(TAG, "failed to call resume");
}
}
@@ -148,7 +162,7 @@ public class CASClient {
try {
ret = mCasInterface.isConnect();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call isConnect");
+ CASLog.e(TAG, "failed to call isConnect");
ret = false;
}
return ret;
@@ -162,7 +176,7 @@ public class CASClient {
try {
ret = mCasInterface.reconnect();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call reconnect");
+ CASLog.e(TAG, "failed to call reconnect");
ret = false;
}
return ret;
@@ -175,7 +189,7 @@ public class CASClient {
try {
mCasInterface.registerListener(listener);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call registerListener");
+ CASLog.e(TAG, "failed to call registerListener");
}
}
@@ -186,7 +200,7 @@ public class CASClient {
try {
mCasInterface.unregisterListener();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call unregisterListener");
+ CASLog.e(TAG, "failed to call unregisterListener");
}
}
@@ -198,7 +212,7 @@ public class CASClient {
try {
ret = mCasInterface.sendTouchEvent(id, action, x, y, pressure, time, orientation, height, width);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call sendTouchEvent");
+ CASLog.e(TAG, "failed to call sendTouchEvent");
ret = false;
}
return ret;
@@ -212,7 +226,7 @@ public class CASClient {
try {
ret = mCasInterface.sendKeyEvent(keycode, action);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call sendKeyEvent");
+ CASLog.e(TAG, "failed to call sendKeyEvent");
ret = false;
}
return ret;
@@ -226,7 +240,7 @@ public class CASClient {
try {
ret = mCasInterface.sendMotionEvent(materAxis, materValue, secondaryAxis, secondaryValue);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call sendMotionEvent");
+ CASLog.e(TAG, "failed to call sendMotionEvent");
ret = false;
}
return ret;
@@ -239,7 +253,7 @@ public class CASClient {
try {
mCasInterface.setCasConnectorInfo(info);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call setCasConnectorInfo");
+ CASLog.e(TAG, "failed to call setCasConnectorInfo");
}
}
@@ -250,7 +264,7 @@ public class CASClient {
try {
mCasInterface.setMediaConfig(mediaConfigMap);
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call setMediaConfig");
+ CASLog.e(TAG, "failed to call setMediaConfig");
}
}
@@ -262,7 +276,7 @@ public class CASClient {
try {
ret = mCasInterface.getState();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call getState");
+ CASLog.e(TAG, "failed to call getState");
ret = 0;
}
return ret;
@@ -276,7 +290,7 @@ public class CASClient {
try {
lag = mCasInterface.getLag();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call getLag");
+ CASLog.e(TAG, "failed to call getLag");
lag = 0;
}
return lag;
@@ -290,7 +304,7 @@ public class CASClient {
try {
ret = mCasInterface.startJniRecv();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call startJniRecv");
+ CASLog.e(TAG, "failed to call startJniRecv");
ret = false;
}
return ret;
@@ -303,7 +317,7 @@ public class CASClient {
try {
mCasInterface.stopJniRecv();
} catch (RemoteException e) {
- CASLog.e(TAG, "filed to call stopJniRecv");
+ CASLog.e(TAG, "failed to call stopJniRecv");
}
}
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java b/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java
index a189ad4b15396a8c10dbc037bb37746b23c8f17d..d541b732d87fb63a0614860b0ba91074da32625b 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/service/CasProcessor.java
@@ -119,6 +119,12 @@ public class CasProcessor extends ICASAidlInterface.Stub {
mSurface = suf;
}
+ @Override
+ public boolean verify() throws RemoteException {
+ CASLog.i(TAG, "verify....");
+ return JNIWrapper.verify();
+ }
+
@Override
public boolean start(boolean isHome) throws RemoteException {
CASLog.i(TAG, "start....");
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
index f31b49fdf1efae5c410fc7497be3bf9d75b3b651..2c0b7dd71bb967d8c938263a08cb7c5fbda57d86 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasConstantsUtil.java
@@ -123,6 +123,16 @@ public class CasConstantsUtil {
*/
public static final String VIRTUAL_HEIGHT = "virtual_height";
+ /**
+ * Physical_width
+ */
+ public static final String WIDTH = "width";
+
+ /**
+ * Physical_height
+ */
+ public static final String HEIGHT = "height";
+
/**
* rgb2yuv rgb转yuv 0:编码时转换 1:抓图时转换
*/
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java
index bae3a2717e5f519f55023fa4e342c0fd84be5e6d..256efc57cb743cd82bf63a3ec8e4d586c61d5dfb 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasMediaUtils.java
@@ -24,10 +24,13 @@ import static com.huawei.cloudphone.utils.CasConstantsUtil.BITRATE;
import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_HEIGHT;
import static com.huawei.cloudphone.utils.CasConstantsUtil.VIRTUAL_WIDTH;
+import android.media.MediaCodecList;
+import android.media.MediaFormat;
+
public class CasMediaUtils {
public static final String TAG = "CasMediaUtils";
- public static final int BITRATE_MIN = 1000000;
+ public static final int BITRATE_MIN = 100000;
public static final int BITRATE_MAX = 10000000;
public static final int MIN = 240;
public static final int MAX = 4096;
@@ -67,4 +70,11 @@ public class CasMediaUtils {
}
return true;
}
+
+ public static boolean isSupportH265() {
+ MediaCodecList mediaCodecList = new MediaCodecList(MediaCodecList.ALL_CODECS);
+ String mimeType = "video/hevc";
+ return mediaCodecList.findDecoderForFormat(
+ MediaFormat.createVideoFormat(mimeType, 1920, 1080)) != null;
+ }
}
\ No newline at end of file