diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java index 1aa47fc455d8ae6da6483fdf5de7249719983abf..2164d88e23103268a2a443bb6654a3bab712b333 100644 --- a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java +++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java @@ -43,6 +43,8 @@ public class ConnectInfos implements Parcelable { public static class ConnectInfo implements Parcelable { @SerializedName("phone_id") private String phoneId; + @SerializedName("udid") + private String udid; @SerializedName("access_info") public AccessInfo accessInfo; @@ -50,6 +52,10 @@ public class ConnectInfos implements Parcelable { return phoneId; } + public String getUdid() { + return udid; + } + public void setPhoneId(String phoneId) { this.phoneId = phoneId; } diff --git a/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java b/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java index 4e41d716e0c60ed7a6dc40e214e5174680506ef4..823711dc6d38cd5a3a2f0bc8110827830193a50c 100644 --- a/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java +++ b/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java @@ -103,13 +103,23 @@ public class ConnectInfoModel implements IConnectInfoModel { throw new CustomException.FailedToGetConnectInfoException(rsp.getErrors().get(0).getErrorMsg()); } ConnectInfos.ConnectInfo ConnectInfo = rsp.getConnectInfos().get(0); - return Collections.singletonList( - GenerateConnectInfo(ConnectInfo.getAccessInfo().getAccessIp(), - String.valueOf(ConnectInfo.getAccessInfo().getAccessPort()), - ConnectInfo.getAccessInfo().getSessionId(), - ConnectInfo.getAccessInfo().getTicket(), - ConnectInfo.getPhoneId(), - ConnectInfo.getAccessInfo().getTimestamp())); + if (ConnectInfo.getUdid() != null) { + return Collections.singletonList( + GenerateConnectInfo(ConnectInfo.getAccessInfo().getAccessIp(), + String.valueOf(ConnectInfo.getAccessInfo().getAccessPort()), + ConnectInfo.getAccessInfo().getSessionId(), + ConnectInfo.getAccessInfo().getTicket(), + ConnectInfo.getAccessInfo().getSessionId(), + ConnectInfo.getAccessInfo().getTimestamp())); + } else { + return Collections.singletonList( + GenerateConnectInfo(ConnectInfo.getAccessInfo().getAccessIp(), + String.valueOf(ConnectInfo.getAccessInfo().getAccessPort()), + ConnectInfo.getAccessInfo().getSessionId(), + ConnectInfo.getAccessInfo().getTicket(), + ConnectInfo.getPhoneId(), + ConnectInfo.getAccessInfo().getTimestamp())); + } } else { CPHError rsp; try { diff --git a/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java b/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java index b369e65997c142059991c0a70117cb47d57fbcdc..1a55b90daf91c4562a2d064a424464ba17848e7c 100644 --- a/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java +++ b/app/src/main/java/com/huawei/cloudapp/ui/fragment/home/PhoneListFragment.java @@ -627,6 +627,7 @@ public class PhoneListFragment extends CloudPhoneFragment implements IHandleData if (mPhoneListAdapter != null && !mPhoneListAdapter.getData().isEmpty()) { mPhoneListAdapter.setNewInstance(null); } + mPosition = 0; } PhoneModel phoneModel = new PhoneModel(); PhonePresenter phonePresenter = new PhonePresenter(this, phoneModel); @@ -647,6 +648,7 @@ public class PhoneListFragment extends CloudPhoneFragment implements IHandleData PhoneModel phoneModel = new PhoneModel(); PhonePresenter phonePresenter = new PhonePresenter(this, phoneModel); phonePresenter.getPhoneDetailInfo(mUser, selectedRegion, mUser.getUserProjectId().get(selectedRegion), phoneId); + mPosition = 0; } private void restartPhone(String phoneId) { diff --git a/cloudphone/src/main/cpp/CasController.cpp b/cloudphone/src/main/cpp/CasController.cpp index 5086f472c3631462ba8d272d7ee0f3a505444ff3..7734d60798b008bfc6f20ca508ed401d82fba6b2 100644 --- a/cloudphone/src/main/cpp/CasController.cpp +++ b/cloudphone/src/main/cpp/CasController.cpp @@ -1169,6 +1169,11 @@ void CasController::RecvdAudioData(uint8_t *data, int length) } } +bool CasController::IsMtransValid() +{ + return m_isMTransValid; +} + int32_t OnRecvVideoStreamData(uint8_t* data, uint32_t length) { CasController::GetInstance()->RecvdVideoData(data, length); diff --git a/cloudphone/src/main/cpp/CasController.h b/cloudphone/src/main/cpp/CasController.h index 9064f6fec56b4d935045417a1a3f7903fee60e3b..86def0032e52c774a3a4f92f7f2543d4eff9af06 100644 --- a/cloudphone/src/main/cpp/CasController.h +++ b/cloudphone/src/main/cpp/CasController.h @@ -96,6 +96,8 @@ public: std::string GetSimpleRecvStats(); + bool IsMtransValid(); + private: bool Release(); diff --git a/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp b/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp index 20a6fcf74529be62e14416ad02f36bd189c6f635..a47fd2833cdafd5ccc6f976b6b4d62cb3cbe0bb5 100644 --- a/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp +++ b/cloudphone/src/main/cpp/cas_stream/CasStreamRecvParser.cpp @@ -121,7 +121,7 @@ void HandleCompletePktMsg(CasStreamParseThread *streamParseThread, streamMsgHead CasPktHandle *serviceHandle = streamParseThread->m_streamRecvParser->GetServiceHandle(msgHead->type); if (serviceHandle) { // 直接喂数据给解码控制器逻辑,处理缓存队列解码和直接解码并发问题 - if (msgHead->type == Video) { + if (CasController::GetInstance()->IsMtransValid() && msgHead->type == Video) { CasDataPipe *videoCasDataPipe = (CasDataPipe *)serviceHandle; if (videoCasDataPipe->m_unprocessedSize == 0) { // Video Data pipe 无数据,就转为直接提交MediaCodec diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/audio/AudioTrackerCallback.java b/cloudphone/src/main/java/com/huawei/cloudphone/audio/AudioTrackerCallback.java index af20b609c4f6ea698d3ab0c1aac7cb06dcb3a78a..76013a2627b8a3febdc635e8db8c05bc92e588cb 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/audio/AudioTrackerCallback.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/audio/AudioTrackerCallback.java @@ -27,6 +27,7 @@ import com.huawei.cloudphone.datacenter.NewPacketCallback; import com.huawei.cloudphone.jniwrapper.OpusJNIWrapper; import java.util.ArrayList; +import java.util.Arrays; /** * AudioTrackerCallback @@ -147,6 +148,8 @@ public class AudioTrackerCallback implements NewPacketCallback { private int bufferSizeInBytes = 0; private float vl = 50; private float vr = 50; + private static final int USERSIZE_PCM = 1920; + private static final int USERSIZE_OPUS = 240; public CasAudioPlayer(int pid) { mPid = pid; @@ -217,7 +220,21 @@ public class AudioTrackerCallback implements NewPacketCallback { int userSize = msg.getSize(); byte[] buffer = msg.readBytes(userSize); - mTrackPlayer.write(buffer, 0, userSize, AudioTrack.WRITE_NON_BLOCKING); + if (userSize == USERSIZE_OPUS) { + // decode and play + short[] data = new short[bufferSizeInBytes]; + int dataLen = OpusJNIWrapper.opusDecode(mDecoder, buffer, userSize, data, bufferSizeInBytes * 2); + if (dataLen < 0) { + CASLog.e(TAG, "OPUS decode fail" + "userSize : " + userSize + "inputBuffer : " + Arrays.toString(buffer) + + "outputBuffer :" + Arrays.toString(data)); + return; + } + mTrackPlayer.write(data, 0, dataLen, AudioTrack.WRITE_NON_BLOCKING); + } else if (userSize == USERSIZE_PCM) { + mTrackPlayer.write(buffer, 0, userSize, AudioTrack.WRITE_NON_BLOCKING); + } else { + CASLog.e(TAG, "audioTrackPlayer failed to write, invalid userSize."); + } } private void handleStop(CasRemoteMessage msg) { diff --git a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasAESUtils.java b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasAESUtils.java index eadb0b3a3fd3ea6ae930d80dd56061f8afb6df56..06414abd1ce0e856cb99488a7b0efc9cae04debe 100644 --- a/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasAESUtils.java +++ b/cloudphone/src/main/java/com/huawei/cloudphone/utils/CasAESUtils.java @@ -23,6 +23,7 @@ import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; +import java.security.NoSuchAlgorithmException; public final class CasAESUtils { @@ -124,10 +125,17 @@ public final class CasAESUtils { * @return 盐值 */ public static String getHexSalt() { - SecureRandom random = CasSecurityUtil.drbg(); - byte[] bytes = new byte[SECRET_KET_LENGTH]; - random.nextBytes(bytes); - return bytesToHex(bytes); + SecureRandom random = null; + try { + random = SecureRandom.getInstanceStrong(); + byte[] bytes = new byte[SECRET_KET_LENGTH]; + random.nextBytes(bytes); + String salt = bytesToHex(bytes); + return salt; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return null; } /**