From f9c7341c236f6aac3b093d4ccab0abcd71661173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Tue, 3 Sep 2024 16:06:03 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E7=89=B9=E5=AE=9A?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E4=B8=8B=E5=A4=8D=E5=88=B6=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/activity/CasCloudPhoneActivity.java | 22 +++++++++++-- .../huawei/cloudphone/api/ICloudPhone.java | 7 ++++ .../cloudphone/apiimpl/CloudPhoneImpl.java | 33 +++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index 5ccf1b3..5298765 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -382,6 +382,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa mMediaConfig.put(PHYSICAL_HEIGHT, String.valueOf(metrics.heightPixels)); mCloudPhone.setMediaConfig(mMediaConfig); + setInitClipboardText(); // 先复制内容再打开云手机时,需要发送剪切板内容 getPhoneConnectInfo(mPhoneId); } catch (IllegalArgumentException e) { showDialog(getResources().getString(R.string.cas_phone_input_param_invalid)); @@ -485,11 +486,11 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa try { mCloudPhone.sendClipboardData(charSequence.toString().getBytes()); } catch (Exception e) { - CASLog.i(TAG, "failed to send clipboard data " + e.getMessage()); + CASLog.e(TAG, "failed to send clipboard data " + e.getMessage()); } } } - }, 100); + }, 300); } /** @@ -980,6 +981,23 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa return x >= 0 && x <= view.getWidth() && y >= 0 && y <= view.getHeight(); } + private void setInitClipboardText() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + if (clipboardManager.hasPrimaryClip() && clipboardManager.getPrimaryClip().getItemCount() > 0) { + CharSequence charSequence = clipboardManager.getPrimaryClip().getItemAt(0).getText(); + try { + mCloudPhone.setClipboardText(charSequence.toString()); + } catch (Exception e) { + CASLog.i(TAG, "failed to set init clipboard data " + e.getMessage()); + } + } + } + }, 300); + } + private void getPhoneConnectInfo(String phoneId) { IConnectInfoModel connectInfoModel; if (CasCommonUtils.isDirectMode()) { 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 016d07f..b5632a7 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java @@ -132,6 +132,13 @@ public interface ICloudPhone { */ void sendClipboardData(byte[] data); + /** + * 设置剪切板的值(不是立即发送给云手机) + * + * @param clipboardText + */ + void setClipboardText(String clipboardText); + /** * 设置剪切板监听器 * 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 9513cbf..93b2ecd 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -66,8 +66,10 @@ import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceManager; import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; import com.huawei.cloudphone.virtualdevice.sensor.VirtualSensorManager; +import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Timer; import java.util.TimerTask; @@ -95,7 +97,9 @@ public class CloudPhoneImpl implements ICloudPhone { private static final byte CUSTOM_DATA = 18; private static final byte IME_DATA =14; public static final int RECONNECT_RETRY_MAX_COUNT = 10; + public static final int SEND_IME_DATA_RETRY_MAX_COUNT = 100; // 300ms*100,与重连总时长保持一致 public static final int RECONNECT_INTERVAL_TIME = 2; // 间隔2s,实际执行为3s + public static final int CAS_VERIFY_SUCCESS = 1280; private final Object mCloudPhoneLock = new Object(); private CasProcessor mProccessor = null; @@ -131,6 +135,7 @@ public class CloudPhoneImpl implements ICloudPhone { private int mTouchCount = 0; private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private Toast toast = null; + private String clipboardText = ""; private long initTime = 0; @@ -340,6 +345,17 @@ public class CloudPhoneImpl implements ICloudPhone { } } + public void sendInitClipboardData() { + if (!Objects.equals(clipboardText, "")) { + sendClipboardData(clipboardText.getBytes(StandardCharsets.UTF_8)); + } + } + + @Override + public void setClipboardText(String clipboardText) { + this.clipboardText = clipboardText; + } + @Override public int getRtt() { if (mProccessor != null) { @@ -919,6 +935,10 @@ public class CloudPhoneImpl implements ICloudPhone { if (mStateListener != null) { mStateListener.onNotify(code, describe); } + // 认证成功后发送剪切板数据 + if (code == CAS_VERIFY_SUCCESS) { + sendInitClipboardData(); + } } public void onChannelDataRecv(byte[] data) throws RemoteException { @@ -1003,6 +1023,19 @@ public class CloudPhoneImpl implements ICloudPhone { class TextWatchListener implements CloudPhoneTextWatchListener { @Override public void onTextChange(byte[] data) { + int tryCount = 0; + while (!mProccessor.isConnect() || mProccessor.getState() != JNIState.JNI_CONNECTED) { + if (tryCount >= SEND_IME_DATA_RETRY_MAX_COUNT) { + CASLog.e(TAG, "onTextChange retry failed. processor connect:" + mProccessor.isConnect() + ", processor state:" + mProccessor.getState()); + return; + } + try { + Thread.sleep(300); + } catch (InterruptedException e) { + e.printStackTrace(); + } + tryCount++; + } mProccessor.sendData(JNIWrapper.IMEDATA, data); } } -- Gitee From dccbc5ed4a02f6b6fb0770a43e77d20c4453ad0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Wed, 4 Sep 2024 17:30:13 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java | 3 +++ 1 file changed, 3 insertions(+) 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 93b2ecd..5e39f14 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -1024,6 +1024,9 @@ public class CloudPhoneImpl implements ICloudPhone { @Override public void onTextChange(byte[] data) { int tryCount = 0; + if (mCurrentState != STATE_START) { + return; + } while (!mProccessor.isConnect() || mProccessor.getState() != JNIState.JNI_CONNECTED) { if (tryCount >= SEND_IME_DATA_RETRY_MAX_COUNT) { CASLog.e(TAG, "onTextChange retry failed. processor connect:" + mProccessor.isConnect() + ", processor state:" + mProccessor.getState()); -- Gitee From 8f51c161d5c061d1f0a27ee90030c8a1955d6916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Fri, 6 Sep 2024 17:15:55 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E9=80=80=E5=87=BA=E3=80=81=E8=BF=9E=E6=8E=A5=E6=97=B6=E5=81=B6?= =?UTF-8?q?=E5=8F=91=E7=9A=84=E9=BB=91=E5=B1=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloudphone/apiimpl/CloudPhoneImpl.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) 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 5e39f14..b63c7bf 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -70,6 +70,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Random; import java.util.Timer; import java.util.TimerTask; @@ -136,6 +137,7 @@ public class CloudPhoneImpl implements ICloudPhone { private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private Toast toast = null; private String clipboardText = ""; + private int surfaceId = -1; // 避免快速连接时新的窗口已建立,旧的窗口执行销毁操作发送pause private long initTime = 0; @@ -419,14 +421,26 @@ public class CloudPhoneImpl implements ICloudPhone { mSurfaceView = new PhoneView(activity, false); } mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { + private int curSurfaceId; + @Override public void surfaceCreated(SurfaceHolder holder) { - CASLog.i(TAG, "surfaceCreated..."); + Random random = new Random(); + curSurfaceId = random.nextInt(1000); + while (curSurfaceId == surfaceId) { + curSurfaceId = random.nextInt(1000); + } + surfaceId = curSurfaceId; + CASLog.i(TAG, "surfaceCreated, surfaceId:" + this.curSurfaceId); mIsNewCreated = true; } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + if (this.curSurfaceId != surfaceId) { + CASLog.w(TAG, "cancel surfaceChanged(). curSurfaceId:" + this.curSurfaceId + ", surfaceId:" + surfaceId); + return; + } mDisplayWidth = Math.min(width, height); mDisplayHeight = Math.max(width, height); @@ -454,9 +468,13 @@ public class CloudPhoneImpl implements ICloudPhone { @Override public void surfaceDestroyed(SurfaceHolder holder) { + if (this.curSurfaceId != surfaceId) { + CASLog.w(TAG, "cancel surfaceDestroyed(). curSurfaceId:" + this.curSurfaceId + ", surfaceId:" + surfaceId); + return; + } synchronized (mCloudPhoneLock) { try { - CASLog.i(TAG, "surfaceDestroyed..."); + CASLog.i(TAG, "surfaceDestroyed, surfaceId:" + surfaceId); if (mProccessor != null && mProccessor.getState() != JNIState.JNI_STOPPED) { mProccessor.stop(true); } -- Gitee From 9d9c1780e13c33ddf5ccd182b550247beebb6eca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Tue, 10 Sep 2024 15:08:59 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b63c7bf..4bcb9d5 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -67,10 +67,10 @@ import com.huawei.cloudphone.virtualdevice.common.VirtualDeviceProtocol; import com.huawei.cloudphone.virtualdevice.sensor.VirtualSensorManager; import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; import java.util.HashMap; import java.util.Map; import java.util.Objects; -import java.util.Random; import java.util.Timer; import java.util.TimerTask; @@ -425,7 +425,7 @@ public class CloudPhoneImpl implements ICloudPhone { @Override public void surfaceCreated(SurfaceHolder holder) { - Random random = new Random(); + SecureRandom random = new SecureRandom(); curSurfaceId = random.nextInt(1000); while (curSurfaceId == surfaceId) { curSurfaceId = random.nextInt(1000); -- Gitee From 58816dbb376522f1b94886ed4f875f7cc9689e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Thu, 12 Sep 2024 19:35:21 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/management/ConnectInfoModel.java | 21 +++--- .../cloudapp/model/management/UserModel.java | 2 +- .../ui/activity/CasCloudPhoneActivity.java | 64 +++++++++---------- .../cloudapp/utils/CasConstantsUtil.java | 4 +- .../res/layout/cas_activity_fullscreen.xml | 38 +++++------ app/src/main/res/values/strings.xml | 2 +- config.gradle | 2 +- 7 files changed, 70 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/com/huawei/cloudapp/model/management/ConnectInfoModel.java b/app/src/main/java/com/huawei/cloudapp/model/management/ConnectInfoModel.java index d80c021..7753783 100644 --- a/app/src/main/java/com/huawei/cloudapp/model/management/ConnectInfoModel.java +++ b/app/src/main/java/com/huawei/cloudapp/model/management/ConnectInfoModel.java @@ -5,6 +5,7 @@ import static com.huawei.cloudapp.utils.CasConstantsUtil.ALLOCATION; import static com.huawei.cloudapp.utils.CasConstantsUtil.AVAILABLE_PLAYTIME; import static com.huawei.cloudapp.utils.CasConstantsUtil.BACKGROUND_TIMEOUT; import static com.huawei.cloudapp.utils.CasConstantsUtil.CLIENT_TYPE; +import static com.huawei.cloudapp.utils.CasConstantsUtil.CLOUD_PHONE_ID; import static com.huawei.cloudapp.utils.CasConstantsUtil.CONNECTION; import static com.huawei.cloudapp.utils.CasConstantsUtil.ERROR_CODE; import static com.huawei.cloudapp.utils.CasConstantsUtil.ERROR_MSG; @@ -45,12 +46,10 @@ import okhttp3.Response; public class ConnectInfoModel implements IConnectInfoModel { public static final String TAG = "ConnectInfoModel"; - private String mPhoneId; @Override public void getConnectInfo(User user, String phoneId, String region, OnRequestListener onRequestListener) { String url = getManagementUrl() + "/" + CONNECTION + "/" + ALLOCATION; - mPhoneId = phoneId; HashMap requestBody = new HashMap(); requestBody.put(PHONE_ID, phoneId); requestBody.put(CLIENT_TYPE, "ANDROID"); @@ -102,6 +101,12 @@ public class ConnectInfoModel implements IConnectInfoModel { } } + if (!rspMap.containsKey(CLOUD_PHONE_ID) || !CasCommonUtils.isValidUUID((String) rspMap.get(CLOUD_PHONE_ID))) { + Log.e(TAG, "The cloud_phone_id is invalid."); + throw new CustomException.ResponseParamsException(); + } + String cloudPhoneId = (String) rspMap.get(CLOUD_PHONE_ID); + if (!rspMap.containsKey(IP) || !rspMap.containsKey(PORT) || !rspMap.containsKey(SESSION_ID)) { Log.e(TAG, "The start param is invalid."); throw new CustomException.ResponseParamsException(); @@ -143,11 +148,12 @@ public class ConnectInfoModel implements IConnectInfoModel { throw new CustomException.ResponseParamsException(); } - CasConnectInfo mConnectInfo = GenerateConnectInfo(ip, port, sessionId, backgroundTimeout, availablePlaytime, touchTimeout); + CasConnectInfo mConnectInfo = GenerateConnectInfo(cloudPhoneId, ip, port, sessionId, backgroundTimeout, availablePlaytime, touchTimeout); return Collections.singletonList(mConnectInfo); } - public CasConnectInfo GenerateConnectInfo(String ip, + public CasConnectInfo GenerateConnectInfo(String cloudPhoneId, + String ip, String port, String sessionId, String backgroundTimeout, @@ -162,13 +168,12 @@ public class ConnectInfoModel implements IConnectInfoModel { CasConnectInfo connectorInfo = new CasConnectInfo(); connectorInfo.setConnectIp(ip); connectorInfo.setConnectPort(port); - connectorInfo.setBackgroundTimeout(backgroundTimeout.isEmpty() ? "60" : backgroundTimeout); + connectorInfo.setBackgroundTimeout(backgroundTimeout.isEmpty() ? "3600" : backgroundTimeout); connectorInfo.setAvailablePlayTime(availablePlayTime.isEmpty() ? "0" : availablePlayTime); connectorInfo.setSessionId(sessionId); connectorInfo.setTicket("ticket_xxxxxx"); - connectorInfo.setAesKey("11111111111111111111111111111111"); - connectorInfo.setAesKey(mPhoneId); - connectorInfo.setAuthTs("987654321"); + connectorInfo.setAesKey(cloudPhoneId); + connectorInfo.setAuthTs(String.valueOf(System.currentTimeMillis())); connectorInfo.setTouchTimeout(touchTimeout.isEmpty() ? "0" : touchTimeout); return connectorInfo; } diff --git a/app/src/main/java/com/huawei/cloudapp/model/management/UserModel.java b/app/src/main/java/com/huawei/cloudapp/model/management/UserModel.java index 7298883..5b35092 100644 --- a/app/src/main/java/com/huawei/cloudapp/model/management/UserModel.java +++ b/app/src/main/java/com/huawei/cloudapp/model/management/UserModel.java @@ -43,7 +43,7 @@ public class UserModel implements IUserModel { @Override public void getUser(User user, String password, String region, final OnRequestListener onRequestListener) { Map userInfo = new HashMap<>(); - userInfo.put(USERNAME, user.getUsername()); + userInfo.put(USERNAME, user.getIamUsername()); userInfo.put(PASSWORD, password); Gson gson = new Gson(); String userInfoJson = gson.toJson(userInfo); diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index 5298765..ebc763a 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -277,46 +277,46 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa mProgressBar = findViewById(R.id.loading_progress_bar); mFrameLayout = (FrameLayout) findViewById(R.id.frame_layout); - mMiniStatisticsTextView = findViewById(R.id.cas_mini_statistic_view); - mMiniStatisticsTextView.setTextColor(Color.argb(255, 216, 234, 196)); +// mMiniStatisticsTextView = findViewById(R.id.cas_mini_statistic_view); +// mMiniStatisticsTextView.setTextColor(Color.argb(255, 216, 234, 196)); mStatisticsTextView = findViewById(R.id.cas_statistic_view); mStatisticsTextView.setTextColor(Color.GREEN); - mStatisticsCheckBox = findViewById(R.id.cas_stats_checkBox); - mStatisticsCheckBox.setTextColor(Color.GREEN); - mStatisticsCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { - if (isChecked) { - mStatisticsTextView.setVisibility(View.VISIBLE); - float density = getResources().getDisplayMetrics().density; - mStatisticsTextView.setHeight((int) (50 * density)); - } else { - mStatisticsTextView.setVisibility(View.INVISIBLE); - } - }); - mTimer.schedule(new TimerTask() { - @Override - public void run() { - runOnUiThread(() -> { - onUpdateSensorInfo(); - onUpdateStatisticInfo(); - }); - } - }, 1000, 1000); +// mStatisticsCheckBox = findViewById(R.id.cas_stats_checkBox); +// mStatisticsCheckBox.setTextColor(Color.GREEN); +// mStatisticsCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { +// if (isChecked) { +// mStatisticsTextView.setVisibility(View.VISIBLE); +// float density = getResources().getDisplayMetrics().density; +// mStatisticsTextView.setHeight((int) (50 * density)); +// } else { +// mStatisticsTextView.setVisibility(View.INVISIBLE); +// } +// }); +// mTimer.schedule(new TimerTask() { +// @Override +// public void run() { +// runOnUiThread(() -> { +// onUpdateSensorInfo(); +// onUpdateStatisticInfo(); +// }); +// } +// }, 1000, 1000); mSensorInfoTextView = findViewById(R.id.cas_sensor_view); mSensorInfoTextView.setTextColor(Color.GREEN); - mSensorInfoCheckBox = findViewById(R.id.cas_sensor_checkBox); - mSensorInfoCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { - if (isChecked) { - mSensorInfoTextView.setVisibility(View.VISIBLE); - float density = getResources().getDisplayMetrics().density; - mSensorInfoTextView.setHeight((int) (50 * density)); - } else { - mSensorInfoTextView.setVisibility(View.INVISIBLE); - } - }); +// mSensorInfoCheckBox = findViewById(R.id.cas_sensor_checkBox); +// mSensorInfoCheckBox.setOnCheckedChangeListener((buttonView, isChecked) -> { +// if (isChecked) { +// mSensorInfoTextView.setVisibility(View.VISIBLE); +// float density = getResources().getDisplayMetrics().density; +// mSensorInfoTextView.setHeight((int) (50 * density)); +// } else { +// mSensorInfoTextView.setVisibility(View.INVISIBLE); +// } +// }); if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{ diff --git a/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java b/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java index 3ecbdc9..3fde14c 100644 --- a/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java +++ b/app/src/main/java/com/huawei/cloudapp/utils/CasConstantsUtil.java @@ -51,6 +51,8 @@ public class CasConstantsUtil { public static final String PHONE_ID = "phone_id"; + public static final String CLOUD_PHONE_ID = "cloud_phone_id"; + public static final String PHONE_NAME = "phone_name"; public static final String REGION_ID = "region_id"; @@ -221,7 +223,7 @@ public class CasConstantsUtil { public static final String PERSONAL = "personal"; public static final String ENTERPRISE = "enterprise"; - public static final String MANAGEMENT_DEV_ENV_URL = "https://140.210.196.28:18000"; + public static final String MANAGEMENT_DEV_ENV_URL = "https://139.9.235.129:18000"; public static final String MANAGEMENT_PROD_ENV_URL = "https://139.9.146.101:18000"; public static final String PHONE = "phone"; public static final String LIST = "list"; diff --git a/app/src/main/res/layout/cas_activity_fullscreen.xml b/app/src/main/res/layout/cas_activity_fullscreen.xml index 9684316..d6253da 100644 --- a/app/src/main/res/layout/cas_activity_fullscreen.xml +++ b/app/src/main/res/layout/cas_activity_fullscreen.xml @@ -19,27 +19,27 @@ android:layout_width="match_parent" android:layout_height="match_parent"/> - + + + + + + + - + + + + + + + - + + + + + - CPH-24.7.0 + 华为云云手机 CasCloudAppMainActivity GameListActivity GameListActivity2 diff --git a/config.gradle b/config.gradle index c8bf37c..3dcc74b 100644 --- a/config.gradle +++ b/config.gradle @@ -5,5 +5,5 @@ ext.versions = [ compileSdkVersion : 31, buildToolsVersion : '28.0.3', versionCode : 1, - versionName : '24.7.0', + versionName : '24.8.1', ] \ No newline at end of file -- Gitee From 41357e3f143ec9b94bd7643329f16a3e951f729f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Sat, 14 Sep 2024 16:52:12 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/activity/CasCloudPhoneActivity.java | 53 ++++++++----------- .../huawei/cloudphone/api/ICloudPhone.java | 7 --- .../cloudphone/apiimpl/CloudPhoneImpl.java | 17 ------ 3 files changed, 21 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index ebc763a..0aaf9ac 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -382,7 +382,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa mMediaConfig.put(PHYSICAL_HEIGHT, String.valueOf(metrics.heightPixels)); mCloudPhone.setMediaConfig(mMediaConfig); - setInitClipboardText(); // 先复制内容再打开云手机时,需要发送剪切板内容 getPhoneConnectInfo(mPhoneId); } catch (IllegalArgumentException e) { showDialog(getResources().getString(R.string.cas_phone_input_param_invalid)); @@ -477,20 +476,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa handler.sendMessage(message); } - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - if (clipboardManager.hasPrimaryClip() && clipboardManager.getPrimaryClip().getItemCount() > 0) { - CharSequence charSequence = clipboardManager.getPrimaryClip().getItemAt(0).getText(); - try { - mCloudPhone.sendClipboardData(charSequence.toString().getBytes()); - } catch (Exception e) { - CASLog.e(TAG, "failed to send clipboard data " + e.getMessage()); - } - } - } - }, 300); + sendClipboardData(); } /** @@ -570,6 +556,9 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa } showDialog(getResources().getString(R.string.cas_phone_invalid_cmd_tip_message)); break; + case CasState.CAS_VERIFY_SUCCESS: + sendClipboardData(); + break; case CasState.CAS_VERIFY_PARAMETER_MISSING: case CasState.CAS_VERIFY_PARAMETER_INVALID: case CasState.CAS_VERIFY_AESKEY_QUERY_FAILED: @@ -902,6 +891,23 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa } } + public void sendClipboardData() { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + if (clipboardManager.hasPrimaryClip() && clipboardManager.getPrimaryClip().getItemCount() > 0) { + CharSequence charSequence = clipboardManager.getPrimaryClip().getItemAt(0).getText(); + try { + mCloudPhone.sendClipboardData(charSequence.toString().getBytes()); + } catch (Exception e) { + CASLog.e(TAG, "failed to send clipboard data " + e.getMessage()); + } + } + } + }, 300); + } + /** * 启动成功后处理任务 */ @@ -981,23 +987,6 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa return x >= 0 && x <= view.getWidth() && y >= 0 && y <= view.getHeight(); } - private void setInitClipboardText() { - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); - if (clipboardManager.hasPrimaryClip() && clipboardManager.getPrimaryClip().getItemCount() > 0) { - CharSequence charSequence = clipboardManager.getPrimaryClip().getItemAt(0).getText(); - try { - mCloudPhone.setClipboardText(charSequence.toString()); - } catch (Exception e) { - CASLog.i(TAG, "failed to set init clipboard data " + e.getMessage()); - } - } - } - }, 300); - } - private void getPhoneConnectInfo(String phoneId) { IConnectInfoModel connectInfoModel; if (CasCommonUtils.isDirectMode()) { 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 b5632a7..016d07f 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/api/ICloudPhone.java @@ -132,13 +132,6 @@ public interface ICloudPhone { */ void sendClipboardData(byte[] data); - /** - * 设置剪切板的值(不是立即发送给云手机) - * - * @param clipboardText - */ - void setClipboardText(String clipboardText); - /** * 设置剪切板监听器 * 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 4bcb9d5..2a8fbd4 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/apiimpl/CloudPhoneImpl.java @@ -100,7 +100,6 @@ public class CloudPhoneImpl implements ICloudPhone { public static final int RECONNECT_RETRY_MAX_COUNT = 10; public static final int SEND_IME_DATA_RETRY_MAX_COUNT = 100; // 300ms*100,与重连总时长保持一致 public static final int RECONNECT_INTERVAL_TIME = 2; // 间隔2s,实际执行为3s - public static final int CAS_VERIFY_SUCCESS = 1280; private final Object mCloudPhoneLock = new Object(); private CasProcessor mProccessor = null; @@ -136,7 +135,6 @@ public class CloudPhoneImpl implements ICloudPhone { private int mTouchCount = 0; private VelocityTracker mVelocityTracker = VelocityTracker.obtain(); private Toast toast = null; - private String clipboardText = ""; private int surfaceId = -1; // 避免快速连接时新的窗口已建立,旧的窗口执行销毁操作发送pause private long initTime = 0; @@ -347,17 +345,6 @@ public class CloudPhoneImpl implements ICloudPhone { } } - public void sendInitClipboardData() { - if (!Objects.equals(clipboardText, "")) { - sendClipboardData(clipboardText.getBytes(StandardCharsets.UTF_8)); - } - } - - @Override - public void setClipboardText(String clipboardText) { - this.clipboardText = clipboardText; - } - @Override public int getRtt() { if (mProccessor != null) { @@ -953,10 +940,6 @@ public class CloudPhoneImpl implements ICloudPhone { if (mStateListener != null) { mStateListener.onNotify(code, describe); } - // 认证成功后发送剪切板数据 - if (code == CAS_VERIFY_SUCCESS) { - sendInitClipboardData(); - } } public void onChannelDataRecv(byte[] data) throws RemoteException { -- Gitee From 9fbd5ec7a1700f8072a8a5ac86c96d6c92646a7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Thu, 19 Sep 2024 10:48:08 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E9=80=80=E5=87=BA=E3=80=81=E8=BF=9B=E5=85=A5=E4=BA=91=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E6=97=B6=E5=81=B6=E7=8E=B0=E7=9A=84=E9=BB=91=E5=B1=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index 0aaf9ac..e70a4b9 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -557,7 +557,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa showDialog(getResources().getString(R.string.cas_phone_invalid_cmd_tip_message)); break; case CasState.CAS_VERIFY_SUCCESS: - sendClipboardData(); + sendClipboardData();; break; case CasState.CAS_VERIFY_PARAMETER_MISSING: case CasState.CAS_VERIFY_PARAMETER_INVALID: -- Gitee From 1adcc0a747b8dcb93eb7302372e0faa16f4aad5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=96=E6=A4=92=E8=82=89=E4=B8=9D?= <641840315@qq.com> Date: Thu, 19 Sep 2024 10:48:29 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=BF=AB=E9=80=9F?= =?UTF-8?q?=E9=80=80=E5=87=BA=E3=80=81=E8=BF=9B=E5=85=A5=E4=BA=91=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E6=97=B6=E5=81=B6=E7=8E=B0=E7=9A=84=E9=BB=91=E5=B1=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java index e70a4b9..0aaf9ac 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/activity/CasCloudPhoneActivity.java @@ -557,7 +557,7 @@ public class CasCloudPhoneActivity extends FragmentActivity implements IHandleDa showDialog(getResources().getString(R.string.cas_phone_invalid_cmd_tip_message)); break; case CasState.CAS_VERIFY_SUCCESS: - sendClipboardData();; + sendClipboardData(); break; case CasState.CAS_VERIFY_PARAMETER_MISSING: case CasState.CAS_VERIFY_PARAMETER_INVALID: -- Gitee