diff --git a/app/build.gradle b/app/build.gradle
index 0146823d1110c3b3bb25a6e07802727b94783785..8e3e5c3d321f908a9ab6b50ad6d08e9979c0aa1a 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -73,6 +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.github.Petterpx:FloatingX:1.3.1'
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/java/com/huawei/cloudapp/common/CasState.java b/app/src/main/java/com/huawei/cloudapp/common/CasState.java
index 2503e76b518a92719bfd8a4bd2e3f0a71cdd717e..80cacb411c4885d3803a371fcfa10d7907dcb52c 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasState.java
+++ b/app/src/main/java/com/huawei/cloudapp/common/CasState.java
@@ -31,6 +31,7 @@ public class CasState {
static public final int CAS_VERIFY_AESKEY_INVALID = 0x0604;
static public final int CAS_VERIFY_DECRYPT_FAILED = 0x0605;
static public final int CAS_VERIFY_FAILED = 0x0606;
+ static public final int CAS_VERIFY_SESSION_ID_INVALID = 0x0607;
static public final int CAS_START_SUCCESS = 0x0800;
static public final int CAS_PARAMETER_MISSING = 0x0904;
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 69c06aaaa363a7f84c45cf21f4ae23bc1289a160..e33eb1669f9410bd0829652d181cbd0543322c1b 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
+++ b/app/src/main/java/com/huawei/cloudapp/ui/CasCloudPhoneActivity.java
@@ -37,11 +37,11 @@ import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
-import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RelativeLayout;
+import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
@@ -66,6 +66,8 @@ import com.huawei.cloudphone.api.CloudPhoneVirtualDevDataListener;
import com.huawei.cloudphone.api.ICloudPhone;
import com.huawei.cloudphone.virtualdevice.VirtualDeviceSession;
import com.huawei.cloudphone.virtualdevice.common.RingBufferVirtualDeviceIO;
+import com.petterp.floatingx.assist.FxGravity;
+import com.petterp.floatingx.assist.helper.ScopeHelper;
import java.util.HashMap;
@@ -145,11 +147,10 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
// debug info
private boolean isShowingLagInfoView;
- private TextView lag;
- private Button lagSwitch;
+ private Switch lagSwitch;
private TextView textCtrl;
private RelativeLayout ctrView;
- private Button mQuitCloudPhone;
+ private TextView mQuitCloudPhone;
// intent trans value
private CasConnectInfo connectInfo;
@@ -259,14 +260,11 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
mProgressBar = findViewById(R.id.loading_progress_bar);
mFrameLayout = (FrameLayout) findViewById(R.id.frame_layout);
mFloatContainer = (FrameLayout) findViewById(R.id.floatContainer);
- lag = (TextView) findViewById(R.id.lag);
- lagSwitch = (Button) findViewById(R.id.lag_switch);
+ lagSwitch = (Switch) findViewById(R.id.lag_switch);
lagSwitch.setOnClickListener(CasCloudPhoneActivity.this);
- textCtrl = (TextView) findViewById(R.id.tv_ctrl);
- textCtrl.setOnClickListener(CasCloudPhoneActivity.this);
ctrView = (RelativeLayout) findViewById(R.id.ctr_view);
ctrView.setOnClickListener(CasCloudPhoneActivity.this);
- mQuitCloudPhone = (Button) findViewById(R.id.quit_cloud_phone);
+ mQuitCloudPhone = (TextView) findViewById(R.id.quit_cloud_phone);
mQuitCloudPhone.setOnClickListener(CasCloudPhoneActivity.this);
// ctrlView
qualityRadioViewGroup = findViewById(R.id.pic_quality_choose_layout);
@@ -277,8 +275,20 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
qualityRadioViewGroup.check(radioViewMain.getId());
qualityRadioViewGroup.setOnCheckedChangeListener(qualityCheckedChangeListener);
+ float dp = getResources().getDisplayMetrics().density;
+ ScopeHelper.builder().setLayout(R.layout.cas_ctrl_button_view).
+ setEnableEdgeAdsorption(true).
+ setEdgeOffset(10f).
+ setEnableScrollOutsideScreen(true).
+ setGravity(FxGravity.LEFT_OR_TOP).
+ setEnableAssistDirection(150 * dp, 0f, 0f, 0f).
+ build().toControl(this).show();
+ textCtrl = (TextView) findViewById(R.id.tv_ctrl);
+ textCtrl.setOnClickListener(CasCloudPhoneActivity.this);
+ textCtrl.setBackgroundResource(R.drawable.button_sub_action_selector);
+
setRotation(mOrientation);
- isShowingLagInfoView = true;
+ lagSwitch.setChecked(false);
gAcitivity = this;
try {
mCloudPhone = CloudPhoneManager.createCloudPhoneInstance();
@@ -442,7 +452,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CASLog.i(TAG, "processStateChangeMsg code = " + code);
switch (code) {
case CasState.CAS_START_SUCCESS:
- lag.setVisibility(View.VISIBLE);
mProgressBar.setVisibility(View.GONE);
startSuccessThreadTask();
handleStartSuccessMsg(msg);
@@ -474,6 +483,9 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
case CasState.CAS_VERIFY_FAILED:
showDialog(getResources().getString(R.string.cas_phone_start_auth_fail_tip_message));
break;
+ case CasState.CAS_VERIFY_SESSION_ID_INVALID:
+ showDialog(getResources().getString(R.string.cas_phone_session_invalid_tip_message));
+ break;
case CasState.CAS_TRAIL_PLAY_TIMEOUT:
mIsTrailPlayTimeout = true;
if (!mIsActivityBackground) {
@@ -551,7 +563,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
if (Build.VERSION.SDK_INT >= 28) {
// Adapt by setting parameters
- params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
+ params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
} else {
CasAdaptPhoneUtils.getInstance().adaptPhoneNotch(this, params);
}
@@ -595,14 +607,11 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
/**
* update lag info view state
*/
- public void updateLagInfoViewState() {
- isShowingLagInfoView = !isShowingLagInfoView;
- if (isShowingLagInfoView) {
- lag.setVisibility(View.VISIBLE);
- lagSwitch.setText(R.string.cas_close_lag_view);
- } else {
- lag.setVisibility(View.INVISIBLE);
- lagSwitch.setText(R.string.cas_show_lag_view);
+ public void updateLagInfoViewState(Boolean isChecked) {
+ isShowingLagInfoView = isChecked;
+ if (!isShowingLagInfoView) {
+ textCtrl.setText("CTRL");
+ textCtrl.setTextColor(getResources().getColor(R.color.black));
}
}
@@ -715,8 +724,8 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
builder.setTitle(R.string.cas_phone_quit_app_tip_message);
builder.setContentView(contentView);
- builder.setPositiveButton("取消", dialogListener);
- builder.setNegativeButton("退出", new DialogInterface.OnClickListener() {
+ builder.setPositiveButton(getResources().getString(R.string.cas_phone_cancel_tip_message), dialogListener);
+ builder.setNegativeButton(getResources().getString(R.string.cas_phone_quit_app_tip_message), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
CASLog.i(TAG, "showUiLevelDialog stopCloudPhone");
@@ -737,7 +746,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
CasCommonDialog.DialogClickListener dialogListener = new CasCommonDialog.DialogClickListener();
builder.setTitle(R.string.cas_phone_tip);
builder.setMessage(message);
- builder.setPositiveButton(R.string.cas_phone_quit_tip_message, dialogListener);
+ builder.setPositiveButton(R.string.cas_phone_quit_app_tip_message, dialogListener);
mDialog = builder.create();
mDialog.setCanceledOnTouchOutside(false);
@@ -801,22 +810,22 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
* resident lag
*/
private void setLagText(int lagVal) {
+ if (!isShowingLagInfoView) return;
String lagContent = String.valueOf(lagVal);
if (lagVal > REFERENCE_LAG_MAX_VALUE || lagVal <= REFERENCE_LAG_ZERO_VALUE) {
lagContent = "*";
}
- String lagStr = RESIDENT_LAG_FORMAT + lagContent + RESIDENT_LAG_UNIT_FORMAT;
if (lagVal > REFERENCE_LAG_MID_VALUE) {
- lag.setTextColor(Color.RED);
+ textCtrl.setTextColor(Color.RED);
} else if (lagVal > REFERENCE_LAG_MIN_VALUE) {
- lag.setTextColor(Color.YELLOW);
+ textCtrl.setTextColor(Color.YELLOW);
} else if (lagVal > REFERENCE_LAG_ZERO_VALUE) {
- lag.setTextColor(Color.GREEN);
+ textCtrl.setTextColor(Color.GREEN);
} else {
- lag.setTextColor(Color.RED);
+ textCtrl.setTextColor(Color.RED);
}
- lag.setText(lagStr);
+ textCtrl.setText(lagContent);
}
@Override
@@ -830,7 +839,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements View.OnCl
} else if (id == R.id.ctr_view) {
switchCtrlViewShow();
} else if (id == R.id.lag_switch) {
- updateLagInfoViewState();
+ updateLagInfoViewState(lagSwitch.isChecked());
}
}
diff --git a/app/src/main/res/layout/cas_activity_fullscreen.xml b/app/src/main/res/layout/cas_activity_fullscreen.xml
index 6866007a0f8cfd7fa2692f0b2860e7cd5ea1dcd9..b715b168468c7db3e56214f262e03fceca12575f 100644
--- a/app/src/main/res/layout/cas_activity_fullscreen.xml
+++ b/app/src/main/res/layout/cas_activity_fullscreen.xml
@@ -13,6 +13,11 @@
android:background="@color/cas_black"
android:focusable="true">
+
+
+
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/cas_ctrl_button_view.xml b/app/src/main/res/layout/cas_ctrl_button_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0d933fc62a2b0590a602ee69fe7ae0f6f2ecf072
--- /dev/null
+++ b/app/src/main/res/layout/cas_ctrl_button_view.xml
@@ -0,0 +1,13 @@
+
+
+
\ 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 82531f737e440d982831f51ac9cabb6100e38cc7..25a81e3b876452fa9a52c9ab6bf31882a911e9f5 100644
--- a/app/src/main/res/layout/cas_ctrl_view.xml
+++ b/app/src/main/res/layout/cas_ctrl_view.xml
@@ -60,21 +60,45 @@
-
+ android:orientation="horizontal"
+ >
-
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 64d79fe470f3ad8c29e780f1c80f6cfa27f73c13..d55f1bff61ff8508f30229a442c7c479701b94d7 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -13,7 +13,7 @@
#FFFFFF
#000000
- #70000000
+ #A8000000
#424242
#a1a1a1
#42369a
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2a051e4d73295d1b961de620b0875cfb4226b9dc..27b292ddc8a65ec027a7fd79209591d301d4d0e8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -10,7 +10,6 @@
退出
确定
取消
- 退出
连接服务器失败,请稍后重试
启动失败
认证失败
@@ -27,12 +26,12 @@
输入的参数不合法
初始化状态错误,请重试
初始化失败,请重试
+ 登录信息失效,请重新登录
云手机ip:
APP连接
H5连接
云手机port:
- 关闭时延数据
- 显示时延数据
+ 时延
编码类型:
软编
硬编
diff --git a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
index 0fab717377b0d7f4032397c6ff911c3cc8c5ecc0..7744c1d6728c8843b010c5e79616a3f95f1338bf 100644
--- a/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
+++ b/cloudphone/src/main/cpp/cas_decoder/CasDecoder.cpp
@@ -32,6 +32,7 @@ namespace {
const char *MIME_TYPE_H264 = "video/avc";
const char *MIME_TYPE_H265 = "video/hevc";
const char *HW_H264_DECODER_NAME = "OMX.hisi.video.decoder.avc";
+ const char *HW_H265_DECODER_NAME = " OMX.hisi.video.decoder.hevc";
// the end-of-picture bits appending to the origin h264 frame
const uint8_t H264_NAL_EOPIC[] = {
0x00, 0x00, 0x01, 0x1D,
@@ -92,9 +93,14 @@ uint32_t CasDecoder::Init(ANativeWindow *nativeWindow, FrameType frameType, int
INFO("DECODER_SDK_UNSUPPORTED m_sdkNo = %d", m_sdkNo);
return DECODER_SDK_UNSUPPORTED;
}
+ m_frameType = frameType;
m_mimeType = frameType == FrameType::H264 ? MIME_TYPE_H264 : MIME_TYPE_H265;
if (m_isHuawei && m_sdkNo >= SDK_VERSION_BORDER) {
- m_mediaCodec = AMediaCodec_createCodecByName(HW_H264_DECODER_NAME);
+ if (frameType == FrameType::H264) {
+ m_mediaCodec = AMediaCodec_createCodecByName(HW_H264_DECODER_NAME);
+ } else {
+ m_mediaCodec = AMediaCodec_createCodecByName(HW_H265_DECODER_NAME);
+ }
if (m_mediaCodec == nullptr) {
m_mediaCodec = AMediaCodec_createDecoderByType(m_mimeType);
m_isHuawei = false;
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 85e53ab48f1e2211be62cfb9709923156f5413f4..ddb3569f18e53bdef8d01b42fad4771a81903914 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java
@@ -241,6 +241,8 @@ 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);
}
}
}
diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java
index c363a67e4aee6741349a214f5ffde461f6fe3345..9e780bc919aa99ba0433f761c66061e5f81c2570 100644
--- a/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java
+++ b/cloudphone/src/main/java/com/huawei/cloudphone/virtualdevice/sensor/VirtualSensorManager.java
@@ -29,8 +29,8 @@ import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol.MsgHeade
public class VirtualSensorManager extends VirtualDeviceManager {
private static final String TAG = "VirtualSensorManager";
- public static final short DEV_GYROSCOPE = 0x0;
- public static final short DEV_ACCELERATION = 0x1;
+ public static final short DEV_ACCELERATION = 0x0;
+ public static final short DEV_GYROSCOPE = 0x1;
public static final short OPT_SENSOR_ENABLE_REQ = 0x1;
public static final short OPT_SENSOR_ENABLE_RSP = 0x1001;
public static final short OPT_SENSOR_DISABLE_REQ = 0x2;