diff --git a/app/build.gradle b/app/build.gradle
index 4c0274f37b7bb29e40e9acb97e7c86ef480da40d..4dcd9d140ff1defa9ebf99157e6f6112c2ac370e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,6 +10,7 @@ android {
versionCode versions.versionCode
versionName versions.versionName
archivesBaseName = "CloudApp_" + versionName
+ buildConfigField "boolean", "IS_DIRECT_MODE", "true"
}
lintOptions {
@@ -64,6 +65,9 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
+ viewBinding {
+ enabled true
+ }
}
dependencies {
@@ -72,13 +76,23 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.github.bumptech.glide:glide:4.13.0'
implementation 'androidx.cardview:cardview:1.0.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
+ implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
+ implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
+ implementation 'androidx.navigation:navigation-fragment:2.3.0'
+ implementation 'androidx.navigation:navigation-ui:2.3.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.3'
implementation 'com.android.support:design:28.0.0'
- implementation 'com.github.shem8:material-login:2.1.1'
- implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx'
+ implementation'com.android.support:support-v4:28.0.0'
implementation 'org.bouncycastle:bcprov-jdk15to18:1.71'
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.10.0'
+ implementation 'com.google.android.material:material:1.6.1'
+ implementation 'io.github.scwang90:refresh-layout-kernel:2.1.0'
+ implementation 'io.github.scwang90:refresh-header-classics:2.1.0'
+ implementation 'io.github.scwang90:refresh-footer-classics:2.1.0'
+ implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper:3.0.14"
+ implementation 'com.github.getActivity:Toaster:12.6'
+ implementation 'com.github.Justson.AgentWeb:agentweb-core:v5.0.6-androidx'
+ implementation "com.kongzue.dialogx:DialogX:0.0.49"
implementation project(':cloudphone')
-}
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5575ca1a46bee3c88af2757865851f4567af68f5..7aed78d0347f6136a4dc16c13a3b2efbcfa641db 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,51 +11,71 @@
-
+ android:theme="@style/AppTheme">
+
+
+
+
+ android:windowSoftInputMode="adjustResize" />
+
+
-
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/huawei/cloudapp/common/CasCommonDialog.java b/app/src/main/java/com/huawei/cloudapp/common/CasCommonDialog.java
index 178f00dc042e37ba502b606e0ad5cb155f4a718e..0a21b39e683e3199252fd30fcd24400cf39cb1eb 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasCommonDialog.java
+++ b/app/src/main/java/com/huawei/cloudapp/common/CasCommonDialog.java
@@ -19,6 +19,7 @@ package com.huawei.cloudapp.common;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
+import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
@@ -50,6 +51,7 @@ public class CasCommonDialog extends Dialog {
private String negativeButtonText;
private OnClickListener positiveButtonClickListener;
private OnClickListener negativeButtonClickListener;
+ private int contentGravity;
public Builder(Context context) {
this.context = context;
@@ -104,6 +106,11 @@ public class CasCommonDialog extends Dialog {
return this;
}
+ public Builder setGravity(int gravity) {
+ this.contentGravity = gravity;
+ return this;
+ }
+
public CasCommonDialog create() {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final CasCommonDialog dialog = new CasCommonDialog(context, R.style.dialog);
@@ -144,6 +151,9 @@ public class CasCommonDialog extends Dialog {
}
TextView messageTV = (TextView) layout.findViewById(R.id.message);
+ if (contentGravity != 0) {
+ messageTV.setGravity(contentGravity);
+ }
LinearLayout content = (LinearLayout) layout.findViewById(R.id.content);
if (message != null) {
messageTV.setText(message);
diff --git a/app/src/main/java/com/huawei/cloudapp/common/CasRecord.java b/app/src/main/java/com/huawei/cloudapp/common/CasRecord.java
index 496873f8ae04d5e093eca64346cc7a24e58c3b7f..d4edf8010d075d1cddd562ef5c6671e16e7843a6 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasRecord.java
+++ b/app/src/main/java/com/huawei/cloudapp/common/CasRecord.java
@@ -18,7 +18,12 @@ package com.huawei.cloudapp.common;
import android.content.SharedPreferences;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
import java.util.Arrays;
+import java.util.HashMap;
public class CasRecord {
@@ -57,4 +62,24 @@ public class CasRecord {
}
}
+ public String getRecord(String key) {
+ return mPreferences.getString(key, "");
+ }
+
+ public void setRecord(String key, String value) {
+ mPreferences.edit().putString(key, value).apply();
+ }
+ public void setHashMapRecord(String key, HashMap value) {
+ Gson gson = new Gson();
+ String json = gson.toJson(value);
+ mPreferences.edit().putString(key, json).apply();
+ }
+
+ public HashMap getHashMapRecord(String key) {
+ String json = mPreferences.getString(key, "");
+ Gson gson = new Gson();
+ Type type = new TypeToken>(){}.getType();
+ return gson.fromJson(json, type);
+ }
+
}
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 5839fffe5da7984175cf7e4400317c8f43cf89d1..4831f3506d9b9cb5e32b943b1c9ad4555f3163cd 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasState.java
+++ b/app/src/main/java/com/huawei/cloudapp/common/CasState.java
@@ -55,5 +55,6 @@ public class CasState {
static public final int CAS_SWITCH_FOREGROUND_SUCCESS = 0x1400;
static public final int CAS_EXIT = 0x1700;
static public final int CAS_BACK_HOME = 0x1900;
+ static public final int CAS_OTHERS_CONNECTED = 0x2300;
static public final int CAS_INVALID_CMD = 0xFFFF;
}
diff --git a/app/src/main/java/com/huawei/cloudapp/common/CasUserInfo.java b/app/src/main/java/com/huawei/cloudapp/common/CasUserInfo.java
deleted file mode 100644
index 3df3aaf712192df14848f1656d397870e203f8c6..0000000000000000000000000000000000000000
--- a/app/src/main/java/com/huawei/cloudapp/common/CasUserInfo.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.huawei.cloudapp.common;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-public class CasUserInfo implements Parcelable {
- public static final String BUNDLE_KEY = "CasUserInfo_Key";
-
- /**
- * 构造器
- */
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- @Override
- public CasUserInfo createFromParcel(Parcel in) {
- return new CasUserInfo(in);
- }
-
- @Override
- public CasUserInfo[] newArray(int size) {
- return new CasUserInfo[size];
- }
- };
-
-
- private String mUsername;
- private String mUserToken;
- private String mUserSessionId;
-
- public CasUserInfo(String username, String userToken, String userSessionId) {
- mUsername = username;
- mUserToken = userToken;
- mUserSessionId = userSessionId;
- }
-
- protected CasUserInfo(Parcel in) {
- mUsername = in.readString();
- mUserToken = in.readString();
- mUserSessionId = in.readString();
- }
-
- public String getUsername() {
- return mUsername;
- }
-
- public String getUserToken() {
- return mUserToken;
- }
-
- public String getUserSessionId() {
- return mUserSessionId;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel parcel, int i) {
- parcel.writeString(mUsername);
- parcel.writeString(mUserToken);
- parcel.writeString(mUserSessionId);
- }
-}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/IConnectInfoModel.java b/app/src/main/java/com/huawei/cloudapp/model/IConnectInfoModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..69a3c8908d4629e6599ac41129b36aacc93a467d
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/IConnectInfoModel.java
@@ -0,0 +1,14 @@
+package com.huawei.cloudapp.model;
+
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.management.CasConnectInfo;
+
+import java.util.HashMap;
+import java.util.List;
+
+import okhttp3.Response;
+
+public interface IConnectInfoModel {
+ void getConnectInfo(User user, String phoneId, String region, final OnRequestListener onRequestListener);
+ List parseResponseToConnectInfo(Response response) throws Exception;
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/IHandleData.java b/app/src/main/java/com/huawei/cloudapp/model/IHandleData.java
new file mode 100644
index 0000000000000000000000000000000000000000..fd07ca122fd929336da7fa36a34597ca665e69e8
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/IHandleData.java
@@ -0,0 +1,8 @@
+package com.huawei.cloudapp.model;
+
+import java.util.List;
+
+public interface IHandleData {
+ void handleData(List list, int count);
+ void handleError(Exception e);
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/IPhoneModel.java b/app/src/main/java/com/huawei/cloudapp/model/IPhoneModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..3bfd944710e190289f8a3c60afcba760b50c22bb
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/IPhoneModel.java
@@ -0,0 +1,16 @@
+package com.huawei.cloudapp.model;
+
+import com.huawei.cloudapp.model.bean.PhoneInfo;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.direct.PhoneDetail;
+import com.huawei.cloudapp.model.bean.direct.PhoneJobResponse;
+
+import java.util.HashMap;
+import java.util.List;
+
+public interface IPhoneModel {
+ void getPhoneList(User user, HashMap condition, String region, String projectId, int offset, int limit, final OnRequestListener onRequestListener);
+ void getPhoneDetailInfo(User user, String region, String projectId, String phoneId, final OnRequestListener onRequestListener);
+ void resetPhone(User user, String region, String projectId, List phoneIdList, String imageId, List> property, final OnRequestListener onRequestListener);
+ void restartPhone(User user, String region, String projectId, List phoneIdList, String imageId, List> property, final OnRequestListener onRequestListener);
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/IUserModel.java b/app/src/main/java/com/huawei/cloudapp/model/IUserModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..f19d40e366d99a1881bfe7ad6f01287e806a2527
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/IUserModel.java
@@ -0,0 +1,13 @@
+package com.huawei.cloudapp.model;
+
+import com.huawei.cloudapp.model.bean.User;
+
+import java.util.List;
+import java.util.Map;
+
+import okhttp3.Response;
+
+public interface IUserModel {
+ void getUser(User user, String password, String region, final OnRequestListener onRequestListener);
+ List parseResponseToUser(Response response) throws Exception;
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/OnRequestListener.java b/app/src/main/java/com/huawei/cloudapp/model/OnRequestListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..d3cc101f0fbec43f7d41415c72720cba0991eb4b
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/OnRequestListener.java
@@ -0,0 +1,8 @@
+package com.huawei.cloudapp.model;
+
+import java.util.List;
+
+public interface OnRequestListener {
+ void onSuccess(List t, int count);
+ void onFailure(Exception e);
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/CustomException.java b/app/src/main/java/com/huawei/cloudapp/model/bean/CustomException.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9970a65078cb39036f637a9a23f218522cb24a9
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/CustomException.java
@@ -0,0 +1,74 @@
+package com.huawei.cloudapp.model.bean;
+
+import java.io.IOException;
+
+public class CustomException extends IOException {
+ public CustomException() {
+ super();
+ }
+ public CustomException(String message) {
+ super(message);
+ }
+
+ public static class EmptyResponseFromServerException extends CustomException {
+ }
+ public static class FailedToLogInException extends CustomException {
+ }
+ public static class LogInInfoErrorException extends CustomException {
+ }
+ public static class LogInInfoInvalidException extends CustomException {
+ }
+ public static class FailedToGetTokenException extends CustomException {
+ }
+ public static class FailedToGetPhoneListException extends CustomException {
+ }
+ public static class FailedToGetPhoneDetailException extends CustomException {
+ }
+ public static class BadRequestException extends CustomException {
+ }
+ public static class ForbiddenException extends CustomException {
+ }
+ public static class ResourceNotFoundException extends CustomException {
+ }
+ public static class ServerError extends CustomException {
+ }
+ public static class ServiceUnavailableException extends CustomException {
+ }
+ public static class TokenExpireException extends CustomException {
+ }
+ public static class NoPermissionException extends CustomException {
+ }
+ public static class GetServerListEmptyException extends CustomException {
+ }
+ public static class ResponseParamsException extends CustomException {
+ }
+ public static class FailedToGetConnectInfoException extends CustomException {
+ public FailedToGetConnectInfoException() {
+ super();
+ }
+ public FailedToGetConnectInfoException(String message) {
+ super(message);
+ }
+ }
+ public static class ConnectInfoErrorException extends CustomException {
+ }
+ public static class ParamInvalidException extends CustomException {
+ }
+ public static class OpRestrictedException extends CustomException {
+ }
+ public static class OpSuspendedException extends CustomException {
+ }
+ public static class OpUnverifiedException extends CustomException {
+ }
+ public static class PhoneNotFoundException extends CustomException {
+ }
+ public static class JobNotFoundException extends CustomException {
+ }
+ public static class ServerNotFoundException extends CustomException {
+ }
+ public static class UserNotFoundException extends CustomException {
+ }
+ public static class DeliverJobFailedException extends CustomException {
+ }
+
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/Phone.java b/app/src/main/java/com/huawei/cloudapp/model/bean/Phone.java
new file mode 100644
index 0000000000000000000000000000000000000000..dc28fa8025bf05011b6462f8a0a64c1aeb8c02c3
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/Phone.java
@@ -0,0 +1,327 @@
+package com.huawei.cloudapp.model.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+
+public class Phone implements Parcelable {
+
+ @SerializedName("phone_name")
+ private String phoneName;
+ @SerializedName("server_id")
+ private String serverId;
+ @SerializedName("phone_id")
+ private String phoneId;
+ @SerializedName("phone_model_name")
+ private String phoneModelName;
+ @SerializedName("image_version")
+ private String imageVersion;
+ @SerializedName("image_id")
+ private String imageId;
+ @SerializedName("vnc_enable")
+ private String vncEnable;
+ @SerializedName("status")
+ private int status;
+ @SerializedName("type")
+ private int type;
+ @SerializedName("imei")
+ private String imei;
+ @SerializedName("availability_zone")
+ private String availabilityZone;
+ @SerializedName("traffic_type")
+ private String trafficType;
+ @SerializedName("volume_mode")
+ private int volumeMode;
+ @SerializedName("metadata")
+ private Metadata metadata = new Metadata();
+ @SerializedName("create_time")
+ private String createTime;
+ @SerializedName("update_time")
+ private String updateTime;
+
+ public String getPhoneName() {
+ return phoneName;
+ }
+
+ public void setPhoneName(String phoneName) {
+ this.phoneName = phoneName;
+ }
+
+ public String getServerId() {
+ return serverId;
+ }
+
+ public void setServerId(String serverId) {
+ this.serverId = serverId;
+ }
+
+ public String getPhoneId() {
+ return phoneId;
+ }
+
+ public void setPhoneId(String phoneId) {
+ this.phoneId = phoneId;
+ }
+
+ public String getPhoneModelName() {
+ return phoneModelName;
+ }
+
+ public void setPhoneModelName(String phoneModelName) {
+ this.phoneModelName = phoneModelName;
+ }
+
+ public String getImageVersion() {
+ return imageVersion;
+ }
+
+ public void setImageVersion(String imageVersion) {
+ this.imageVersion = imageVersion;
+ }
+
+ public String getImageId() {
+ return imageId;
+ }
+
+ public void setImageId(String imageId) {
+ this.imageId = imageId;
+ }
+
+ public String getVncEnable() {
+ return vncEnable;
+ }
+
+ public void setVncEnable(String vncEnable) {
+ this.vncEnable = vncEnable;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ public String getImei() {
+ return imei;
+ }
+
+ public void setImei(String imei) {
+ this.imei = imei;
+ }
+
+ public String getAvailabilityZone() {
+ return availabilityZone;
+ }
+
+ public void setAvailabilityZone(String availabilityZone) {
+ this.availabilityZone = availabilityZone;
+ }
+
+ public String getTrafficType() {
+ return trafficType;
+ }
+
+ public void setTrafficType(String trafficType) {
+ this.trafficType = trafficType;
+ }
+
+ public int getVolumeMode() {
+ return volumeMode;
+ }
+
+ public void setVolumeMode(int volumeMode) {
+ this.volumeMode = volumeMode;
+ }
+
+ public Metadata getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(Metadata metadata) {
+ this.metadata = metadata;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public static class Metadata implements Parcelable {
+ @SerializedName("order_id")
+ private String orderId;
+ @SerializedName("product_id")
+ private String productId;
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(String orderId) {
+ this.orderId = orderId;
+ }
+
+ public String getProductId() {
+ return productId;
+ }
+
+ public void setProductId(String productId) {
+ this.productId = productId;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.orderId);
+ dest.writeString(this.productId);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.orderId = source.readString();
+ this.productId = source.readString();
+ }
+
+ public Metadata() {
+ }
+
+ protected Metadata(Parcel in) {
+ this.orderId = in.readString();
+ this.productId = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public Metadata createFromParcel(Parcel source) {
+ return new Metadata(source);
+ }
+
+ @Override
+ public Metadata[] newArray(int size) {
+ return new Metadata[size];
+ }
+ };
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.phoneName);
+ dest.writeString(this.serverId);
+ dest.writeString(this.phoneId);
+ dest.writeString(this.phoneModelName);
+ dest.writeString(this.imageVersion);
+ dest.writeString(this.imageId);
+ dest.writeString(this.vncEnable);
+ dest.writeInt(this.status);
+ dest.writeInt(this.type);
+ dest.writeString(this.imei);
+ dest.writeString(this.availabilityZone);
+ dest.writeString(this.trafficType);
+ dest.writeInt(this.volumeMode);
+ dest.writeParcelable(this.metadata, flags);
+ dest.writeString(this.createTime);
+ dest.writeString(this.updateTime);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.phoneName = source.readString();
+ this.serverId = source.readString();
+ this.phoneId = source.readString();
+ this.phoneModelName = source.readString();
+ this.imageVersion = source.readString();
+ this.imageId = source.readString();
+ this.vncEnable = source.readString();
+ this.status = source.readInt();
+ this.type = source.readInt();
+ this.imei = source.readString();
+ this.availabilityZone = source.readString();
+ this.trafficType = source.readString();
+ this.volumeMode = source.readInt();
+ this.metadata = source.readParcelable(Metadata.class.getClassLoader());
+ this.createTime = source.readString();
+ this.updateTime = source.readString();
+ }
+
+ public Phone() {
+ }
+
+ public Phone(String phoneName, String phoneId) {
+ this.phoneName = phoneName;
+ this.serverId = null;
+ this.phoneId = phoneId;
+ this.phoneModelName = null;
+ this.imageVersion = null;
+ this.imageId = null;
+ this.vncEnable = null;
+ this.status = 0;
+ this.type = 0;
+ this.imei = null;
+ this.availabilityZone = null;
+ this.trafficType = null;
+ this.volumeMode = 0;
+ this.metadata = null;
+ this.createTime = null;
+ this.updateTime = null;
+ }
+
+ protected Phone(Parcel in) {
+ this.phoneName = in.readString();
+ this.serverId = in.readString();
+ this.phoneId = in.readString();
+ this.phoneModelName = in.readString();
+ this.imageVersion = in.readString();
+ this.imageId = in.readString();
+ this.vncEnable = in.readString();
+ this.status = in.readInt();
+ this.type = in.readInt();
+ this.imei = in.readString();
+ this.availabilityZone = in.readString();
+ this.trafficType = in.readString();
+ this.volumeMode = in.readInt();
+ this.metadata = in.readParcelable(Metadata.class.getClassLoader());
+ this.createTime = in.readString();
+ this.updateTime = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public Phone createFromParcel(Parcel source) {
+ return new Phone(source);
+ }
+
+ @Override
+ public Phone[] newArray(int size) {
+ return new Phone[size];
+ }
+ };
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/ui/surface/viewpagecards/PhoneCardItem.java b/app/src/main/java/com/huawei/cloudapp/model/bean/PhoneInfo.java
similarity index 53%
rename from app/src/main/java/com/huawei/cloudapp/ui/surface/viewpagecards/PhoneCardItem.java
rename to app/src/main/java/com/huawei/cloudapp/model/bean/PhoneInfo.java
index 49011d0fc194bbeef98b409a109b3c97ab2d5cc7..d48aedca085406b39ce36d223116ef9ce25c7f19 100644
--- a/app/src/main/java/com/huawei/cloudapp/ui/surface/viewpagecards/PhoneCardItem.java
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/PhoneInfo.java
@@ -14,22 +14,42 @@
* limitations under the License.
*/
-package com.huawei.cloudapp.ui.surface.viewpagecards;
+package com.huawei.cloudapp.model.bean;
-public class PhoneCardItem {
+import android.widget.TextView;
+import androidx.annotation.NonNull;
+
+import com.huawei.cloudapp.R;
+
+public class PhoneInfo {
+
+ private Phone mPhone;
private String mPhoneInfo;
- private String mPhoneName;
- private String mPhoneId;
private String mPhoneRegion;
+ private int itemPosition = 0;
+ private boolean checked = false;
+
+ public PhoneInfo(String name, String info, String id, String region) {
+ mPhone = new Phone(name, id);
+ mPhoneInfo = info;
+ mPhoneRegion = region;
+ }
- public PhoneCardItem(String name, String info, String id, String region) {
- mPhoneName = name;
+ public PhoneInfo(Phone phone, String info, String region) {
+ mPhone = phone;
mPhoneInfo = info;
- mPhoneId = id;
mPhoneRegion = region;
}
+ public Phone getPhone() {
+ return mPhone;
+ }
+
+ public void setPhone(Phone phone) {
+ mPhone = phone;
+ }
+
public String getInfo() {
return mPhoneInfo;
}
@@ -38,16 +58,19 @@ public class PhoneCardItem {
mPhoneInfo = info;
}
+ public void setPhoneName(String mPhoneName) {
+ this.mPhone.setPhoneName(mPhoneName);
+ }
public String getName() {
- return mPhoneName;
+ return mPhone.getPhoneName();
}
public String getPhoneId() {
- return mPhoneId;
+ return mPhone.getPhoneId();
}
public void setPhoneId(String mPhoneId) {
- this.mPhoneId = mPhoneId;
+ this.mPhone.setPhoneId(mPhoneId);
}
public String getRegion() {
@@ -57,4 +80,12 @@ public class PhoneCardItem {
public void setRegion(String mPhoneRegion) {
this.mPhoneRegion = mPhoneRegion;
}
+
+ public boolean isChecked() {
+ return checked;
+ }
+
+ public void setChecked(boolean checked) {
+ this.checked = checked;
+ }
}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/User.java b/app/src/main/java/com/huawei/cloudapp/model/bean/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..430f19b081ef06a019584ff85df97bd663dbb663
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/User.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.huawei.cloudapp.model.bean;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.HashMap;
+public class User implements Parcelable {
+ public static final String BUNDLE_KEY = "CasUserInfo_Key";
+
+ private String mUsername;
+ private String mIamUsername;
+ private HashMap mUserToken;
+ private HashMap mUserTokenExpireTime;
+ private HashMap mUserProjectId;
+ private String mUserSessionId;
+
+ public User(String username, String iamUsername,
+ HashMap userToken,
+ HashMap userTokenExpireTime,
+ HashMap userProjectId,
+ String userSessionId) {
+ mUsername = username;
+ mIamUsername = iamUsername;
+
+ if (userToken != null) {
+ mUserToken = userToken;
+ } else {
+ mUserToken = new HashMap<>();
+ }
+
+ if (userTokenExpireTime != null) {
+ mUserTokenExpireTime = userTokenExpireTime;
+ } else {
+ mUserTokenExpireTime = new HashMap<>();
+ }
+
+ if (userProjectId != null) {
+ mUserProjectId = userProjectId;
+ } else {
+ mUserProjectId = new HashMap<>();
+ }
+ mUserSessionId = userSessionId;
+ }
+
+
+ public String getUsername() {
+ return mUsername;
+ }
+
+ public String getIamUsername() {
+ return mIamUsername;
+ }
+
+ public void setUserToken(HashMap mUserToken) {
+ this.mUserToken = mUserToken;
+ }
+
+ public void setUserTokenExpireTime(HashMap mUserTokenExpireTime) {
+ this.mUserTokenExpireTime = mUserTokenExpireTime;
+ }
+
+ public void setUserSessionId(String mUserSessionId) {
+ this.mUserSessionId = mUserSessionId;
+ }
+
+ public String getUserTokenByRegion(String region) {
+ return mUserToken.get(region);
+ }
+
+ public String getUserTokenExpireTimeByRegion(String region) {
+ return mUserTokenExpireTime.get(region);
+ }
+
+ public HashMap getUserToken() {
+ return mUserToken;
+ }
+
+ public HashMap getUserTokenExpireTime() {
+ return mUserTokenExpireTime;
+ }
+
+ public String getUserSessionId() {
+ return mUserSessionId;
+ }
+
+ public HashMap getUserProjectId() {
+ return mUserProjectId;
+ }
+
+ public void setUserProjectId(HashMap mUserProjectId) {
+ this.mUserProjectId = mUserProjectId;
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.mUsername);
+ dest.writeString(this.mIamUsername);
+ dest.writeSerializable(this.mUserToken);
+ dest.writeSerializable(this.mUserTokenExpireTime);
+ dest.writeSerializable(this.mUserProjectId);
+ dest.writeString(this.mUserSessionId);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.mUsername = source.readString();
+ this.mIamUsername = source.readString();
+ this.mUserToken = (HashMap) source.readSerializable();
+ this.mUserTokenExpireTime = (HashMap) source.readSerializable();
+ this.mUserProjectId = (HashMap) source.readSerializable();
+ this.mUserSessionId = source.readString();
+ }
+
+ protected User(Parcel in) {
+ this.mUsername = in.readString();
+ this.mIamUsername = in.readString();
+ this.mUserToken = (HashMap) in.readSerializable();
+ this.mUserTokenExpireTime = (HashMap) in.readSerializable();
+ this.mUserProjectId = (HashMap) in.readSerializable();
+ this.mUserSessionId = in.readString();
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public User createFromParcel(Parcel source) {
+ return new User(source);
+ }
+
+ @Override
+ public User[] newArray(int size) {
+ return new User[size];
+ }
+ };
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/CPHError.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/CPHError.java
new file mode 100644
index 0000000000000000000000000000000000000000..a7fb4a34a84709002124bed2d6aab8b5a987aee8
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/CPHError.java
@@ -0,0 +1,79 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+
+public class CPHError implements Parcelable {
+
+ @SerializedName("error_msg")
+ private String errorMsg;
+ @SerializedName("error_code")
+ private String errorCode;
+ @SerializedName("request_id")
+ private String requestId;
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.errorMsg);
+ dest.writeString(this.errorCode);
+ dest.writeString(this.requestId);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.errorMsg = source.readString();
+ this.errorCode = source.readString();
+ this.requestId = source.readString();
+ }
+
+ public CPHError() {
+ }
+
+ protected CPHError(Parcel in) {
+ this.errorMsg = in.readString();
+ this.errorCode = in.readString();
+ this.requestId = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public CPHError createFromParcel(Parcel source) {
+ return new CPHError(source);
+ }
+
+ @Override
+ public CPHError[] newArray(int size) {
+ return new CPHError[size];
+ }
+ };
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..1aa47fc455d8ae6da6483fdf5de7249719983abf
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ConnectInfos.java
@@ -0,0 +1,351 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class ConnectInfos implements Parcelable {
+
+ @SerializedName("request_id")
+ private String requestId;
+ @SerializedName("connect_infos")
+ private List connectInfos;
+ @SerializedName("errors")
+ private List errors;
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public List getConnectInfos() {
+ return connectInfos;
+ }
+
+ public void setConnectInfos(List connectInfos) {
+ this.connectInfos = connectInfos;
+ }
+
+ public List getErrors() {
+ return errors;
+ }
+
+ public void setErrors(List errors) {
+ this.errors = errors;
+ }
+
+ public static class ConnectInfo implements Parcelable {
+ @SerializedName("phone_id")
+ private String phoneId;
+ @SerializedName("access_info")
+ public AccessInfo accessInfo;
+
+ public String getPhoneId() {
+ return phoneId;
+ }
+
+ public void setPhoneId(String phoneId) {
+ this.phoneId = phoneId;
+ }
+
+ public AccessInfo getAccessInfo() {
+ return accessInfo;
+ }
+
+ public void setAccessInfo(AccessInfo accessInfo) {
+ this.accessInfo = accessInfo;
+ }
+
+ public static class AccessInfo implements Parcelable {
+ @SerializedName("access_ip")
+ private String accessIp;
+ @SerializedName("intranet_ip")
+ private String intranetIp;
+ @SerializedName("access_ipv6")
+ private String accessIpv6;
+ @SerializedName("access_port")
+ private int accessPort;
+ @SerializedName("session_id")
+ private String sessionId;
+ @SerializedName("timestamp")
+ private String timestamp;
+ @SerializedName("ticket")
+ private String ticket;
+
+ public String getAccessIp() {
+ return accessIp;
+ }
+
+ public void setAccessIp(String accessIp) {
+ this.accessIp = accessIp;
+ }
+
+ public String getIntranetIp() {
+ return intranetIp;
+ }
+
+ public void setIntranetIp(String intranetIp) {
+ this.intranetIp = intranetIp;
+ }
+
+ public String getAccessIpv6() {
+ return accessIpv6;
+ }
+
+ public void setAccessIpv6(String accessIpv6) {
+ this.accessIpv6 = accessIpv6;
+ }
+
+ public int getAccessPort() {
+ return accessPort;
+ }
+
+ public void setAccessPort(int accessPort) {
+ this.accessPort = accessPort;
+ }
+
+ public String getSessionId() {
+ return sessionId;
+ }
+
+ public void setSessionId(String sessionId) {
+ this.sessionId = sessionId;
+ }
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+ public void setTimestamp(String timestamp) {
+ this.timestamp = timestamp;
+ }
+
+ public String getTicket() {
+ return ticket;
+ }
+
+ public void setTicket(String ticket) {
+ this.ticket = ticket;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.accessIp);
+ dest.writeString(this.intranetIp);
+ dest.writeString(this.accessIpv6);
+ dest.writeInt(this.accessPort);
+ dest.writeString(this.sessionId);
+ dest.writeString(this.timestamp);
+ dest.writeString(this.ticket);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.accessIp = source.readString();
+ this.intranetIp = source.readString();
+ this.accessIpv6 = source.readString();
+ this.accessPort = source.readInt();
+ this.sessionId = source.readString();
+ this.timestamp = source.readString();
+ this.ticket = source.readString();
+ }
+
+ public AccessInfo() {
+ }
+
+ protected AccessInfo(Parcel in) {
+ this.accessIp = in.readString();
+ this.intranetIp = in.readString();
+ this.accessIpv6 = in.readString();
+ this.accessPort = in.readInt();
+ this.sessionId = in.readString();
+ this.timestamp = in.readString();
+ this.ticket = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public AccessInfo createFromParcel(Parcel source) {
+ return new AccessInfo(source);
+ }
+
+ @Override
+ public AccessInfo[] newArray(int size) {
+ return new AccessInfo[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ return "AccessInfo{" +
+ "accessIp='" + accessIp + '\'' +
+ ", intranetIp='" + intranetIp + '\'' +
+ ", accessIpv6='" + accessIpv6 + '\'' +
+ ", accessPort=" + accessPort +
+ ", sessionId='" + sessionId + '\'' +
+ ", timestamp='" + timestamp + '\'' +
+ ", ticket='" + ticket + '\'' +
+ '}';
+ }
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.phoneId);
+ dest.writeParcelable(this.accessInfo, flags);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.phoneId = source.readString();
+ this.accessInfo = source.readParcelable(AccessInfo.class.getClassLoader());
+ }
+
+ public ConnectInfo() {
+ }
+
+ protected ConnectInfo(Parcel in) {
+ this.phoneId = in.readString();
+ this.accessInfo = in.readParcelable(AccessInfo.class.getClassLoader());
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public ConnectInfo createFromParcel(Parcel source) {
+ return new ConnectInfo(source);
+ }
+
+ @Override
+ public ConnectInfo[] newArray(int size) {
+ return new ConnectInfo[size];
+ }
+ };
+ }
+
+ public static class Errors implements Parcelable {
+ @SerializedName("phone_id")
+ private String phoneId;
+ @SerializedName("error_code")
+ private String errorCode;
+ @SerializedName("error_msg")
+ private String errorMsg;
+
+ public String getPhoneId() {
+ return phoneId;
+ }
+
+ public void setPhoneId(String phoneId) {
+ this.phoneId = phoneId;
+ }
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.phoneId);
+ dest.writeString(this.errorCode);
+ dest.writeString(this.errorMsg);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.phoneId = source.readString();
+ this.errorCode = source.readString();
+ this.errorMsg = source.readString();
+ }
+
+ public Errors() {
+ }
+
+ protected Errors(Parcel in) {
+ this.phoneId = in.readString();
+ this.errorCode = in.readString();
+ this.errorMsg = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public Errors createFromParcel(Parcel source) {
+ return new Errors(source);
+ }
+
+ @Override
+ public Errors[] newArray(int size) {
+ return new Errors[size];
+ }
+ };
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.requestId);
+ dest.writeTypedList(this.connectInfos);
+ dest.writeTypedList(this.errors);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.requestId = source.readString();
+ this.connectInfos = source.createTypedArrayList(ConnectInfos.ConnectInfo.CREATOR);
+ this.errors = source.createTypedArrayList(Errors.CREATOR);
+ }
+
+ public ConnectInfos() {
+ }
+
+ protected ConnectInfos(Parcel in) {
+ this.requestId = in.readString();
+ this.connectInfos = in.createTypedArrayList(ConnectInfos.ConnectInfo.CREATOR);
+ this.errors = in.createTypedArrayList(Errors.CREATOR);
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public ConnectInfos createFromParcel(Parcel source) {
+ return new ConnectInfos(source);
+ }
+
+ @Override
+ public ConnectInfos[] newArray(int size) {
+ return new ConnectInfos[size];
+ }
+ };
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneDetail.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneDetail.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1eea19b602860cc40009fb945f0b5d216040f90
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneDetail.java
@@ -0,0 +1,325 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import com.google.gson.annotations.SerializedName;
+import com.huawei.cloudapp.model.bean.Phone;
+
+import java.util.List;
+
+public class PhoneDetail {
+ @SerializedName("request_id")
+ private String requestId;
+ @SerializedName("phone_name")
+ private String phoneName;
+ @SerializedName("server_id")
+ private String serverId;
+ @SerializedName("phone_id")
+ private String phoneId;
+ @SerializedName("image_id")
+ private String imageId;
+ @SerializedName("phone_model_name")
+ private String phoneModelName;
+ @SerializedName("image_version")
+ private String imageVersion;
+ @SerializedName("status")
+ private int status;
+ @SerializedName("imei")
+ private long imei;
+ @SerializedName("availability_zone")
+ private String availabilityZone;
+ @SerializedName("traffic_type")
+ private String trafficType;
+ @SerializedName("volume_mode")
+ private int volumeMode;
+ @SerializedName("phone_data_volume")
+ private PhoneDataVolume phoneDataVolume;
+ @SerializedName("property")
+ private String property;
+ @SerializedName("metadata")
+ private Phone.Metadata metadata;
+ @SerializedName("create_time")
+ private String createTime;
+ @SerializedName("update_time")
+ private String updateTime;
+ @SerializedName("access_infos")
+ private List accessInfos;
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public String getPhoneName() {
+ return phoneName;
+ }
+
+ public void setPhoneName(String phoneName) {
+ this.phoneName = phoneName;
+ }
+
+ public String getServerId() {
+ return serverId;
+ }
+
+ public void setServerId(String serverId) {
+ this.serverId = serverId;
+ }
+
+ public String getPhoneId() {
+ return phoneId;
+ }
+
+ public void setPhoneId(String phoneId) {
+ this.phoneId = phoneId;
+ }
+
+ public String getImageId() {
+ return imageId;
+ }
+
+ public void setImageId(String imageId) {
+ this.imageId = imageId;
+ }
+
+ public String getPhoneModelName() {
+ return phoneModelName;
+ }
+
+ public void setPhoneModelName(String phoneModelName) {
+ this.phoneModelName = phoneModelName;
+ }
+
+ public String getImageVersion() {
+ return imageVersion;
+ }
+
+ public void setImageVersion(String imageVersion) {
+ this.imageVersion = imageVersion;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public long getImei() {
+ return imei;
+ }
+
+ public void setImei(long imei) {
+ this.imei = imei;
+ }
+
+ public String getAvailabilityZone() {
+ return availabilityZone;
+ }
+
+ public void setAvailabilityZone(String availabilityZone) {
+ this.availabilityZone = availabilityZone;
+ }
+
+ public String getTrafficType() {
+ return trafficType;
+ }
+
+ public void setTrafficType(String trafficType) {
+ this.trafficType = trafficType;
+ }
+
+ public int getVolumeMode() {
+ return volumeMode;
+ }
+
+ public void setVolumeMode(int volumeMode) {
+ this.volumeMode = volumeMode;
+ }
+
+ public PhoneDataVolume getPhoneDataVolume() {
+ return phoneDataVolume;
+ }
+
+ public void setPhoneDataVolume(PhoneDataVolume phoneDataVolume) {
+ this.phoneDataVolume = phoneDataVolume;
+ }
+
+ public String getProperty() {
+ return property;
+ }
+
+ public void setProperty(String property) {
+ this.property = property;
+ }
+
+ public Phone.Metadata getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(Phone.Metadata metadata) {
+ this.metadata = metadata;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public List getAccessInfos() {
+ return accessInfos;
+ }
+
+ public void setAccessInfos(List accessInfos) {
+ this.accessInfos = accessInfos;
+ }
+
+ public static class PhoneDataVolume {
+ @SerializedName("volume_type")
+ private String volumeType;
+ @SerializedName("volume_size")
+ private int volumeSize;
+
+ public String getVolumeType() {
+ return volumeType;
+ }
+
+ public void setVolumeType(String volumeType) {
+ this.volumeType = volumeType;
+ }
+
+ public int getVolumeSize() {
+ return volumeSize;
+ }
+
+ public void setVolumeSize(int volumeSize) {
+ this.volumeSize = volumeSize;
+ }
+ }
+
+ public static class AccessInfo {
+ @SerializedName("type")
+ private String type;
+ @SerializedName("device_ip")
+ private String deviceIp;
+ @SerializedName("phone_ip")
+ private String phoneIp;
+ @SerializedName("listen_port")
+ private int listenPort;
+ @SerializedName("access_ip")
+ private String accessIp;
+ @SerializedName("public_ip")
+ private String publicIp;
+ @SerializedName("intranet_ip")
+ private String intranetIp;
+ @SerializedName("server_ip")
+ private String serverIp;
+ @SerializedName("access_port")
+ private int accessPort;
+ @SerializedName("phone_ipv6")
+ private String phoneIpv6;
+ @SerializedName("server_ipv6")
+ private String serverIpv6;
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getDeviceIp() {
+ return deviceIp;
+ }
+
+ public void setDeviceIp(String deviceIp) {
+ this.deviceIp = deviceIp;
+ }
+
+ public String getPhoneIp() {
+ return phoneIp;
+ }
+
+ public void setPhoneIp(String phoneIp) {
+ this.phoneIp = phoneIp;
+ }
+
+ public int getListenPort() {
+ return listenPort;
+ }
+
+ public void setListenPort(int listenPort) {
+ this.listenPort = listenPort;
+ }
+
+ public String getAccessIp() {
+ return accessIp;
+ }
+
+ public void setAccessIp(String accessIp) {
+ this.accessIp = accessIp;
+ }
+
+ public String getPublicIp() {
+ return publicIp;
+ }
+
+ public void setPublicIp(String publicIp) {
+ this.publicIp = publicIp;
+ }
+
+ public String getIntranetIp() {
+ return intranetIp;
+ }
+
+ public void setIntranetIp(String intranetIp) {
+ this.intranetIp = intranetIp;
+ }
+
+ public String getServerIp() {
+ return serverIp;
+ }
+
+ public void setServerIp(String serverIp) {
+ this.serverIp = serverIp;
+ }
+
+ public int getAccessPort() {
+ return accessPort;
+ }
+
+ public void setAccessPort(int accessPort) {
+ this.accessPort = accessPort;
+ }
+
+ public String getPhoneIpv6() {
+ return phoneIpv6;
+ }
+
+ public void setPhoneIpv6(String phoneIpv6) {
+ this.phoneIpv6 = phoneIpv6;
+ }
+
+ public String getServerIpv6() {
+ return serverIpv6;
+ }
+
+ public void setServerIpv6(String serverIpv6) {
+ this.serverIpv6 = serverIpv6;
+ }
+ }
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneJobRequest.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneJobRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4afa2cab4ddcdfcacd569af32b7adf42d6fe3d7c
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneJobRequest.java
@@ -0,0 +1,130 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PhoneJobRequest implements Parcelable {
+
+ @SerializedName("image_id")
+ private String imageId;
+ @SerializedName("phones")
+ private List phones = new ArrayList<>();
+
+ public String getImageId() {
+ return imageId;
+ }
+
+ public void setImageId(String imageId) {
+ this.imageId = imageId;
+ }
+
+ public List getPhones() {
+ return phones;
+ }
+
+ public void setPhones(List phones) {
+ this.phones = phones;
+ }
+
+ public static class PhoneProperty implements Parcelable {
+ @SerializedName("phone_id")
+ private String mPhoneId;
+ @SerializedName("property")
+ private String mProperty;
+
+ public PhoneProperty(String phoneId, String property) {
+ mPhoneId = phoneId;
+ mProperty = property;
+ }
+
+ public String getPhoneId() {
+ return mPhoneId;
+ }
+
+ public void setPhoneId(String mPhoneId) {
+ this.mPhoneId = mPhoneId;
+ }
+
+ public String getProperty() {
+ return mProperty;
+ }
+
+ public void setProperty(String mProperty) {
+ this.mProperty = mProperty;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.mPhoneId);
+ dest.writeString(this.mProperty);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.mPhoneId = source.readString();
+ this.mProperty = source.readString();
+ }
+
+ protected PhoneProperty(Parcel in) {
+ this.mPhoneId = in.readString();
+ this.mProperty = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public PhoneProperty createFromParcel(Parcel source) {
+ return new PhoneProperty(source);
+ }
+
+ @Override
+ public PhoneProperty[] newArray(int size) {
+ return new PhoneProperty[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.imageId);
+ dest.writeTypedList(this.phones);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.imageId = source.readString();
+ this.phones = source.createTypedArrayList(PhoneProperty.CREATOR);
+ }
+
+ public PhoneJobRequest() {
+ }
+
+ protected PhoneJobRequest(Parcel in) {
+ this.imageId = in.readString();
+ this.phones = in.createTypedArrayList(PhoneProperty.CREATOR);
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public PhoneJobRequest createFromParcel(Parcel source) {
+ return new PhoneJobRequest(source);
+ }
+
+ @Override
+ public PhoneJobRequest[] newArray(int size) {
+ return new PhoneJobRequest[size];
+ }
+ };
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneJobResponse.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneJobResponse.java
new file mode 100644
index 0000000000000000000000000000000000000000..7ae10ecdaf381e7bd6d3700a04bfc225366b7517
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneJobResponse.java
@@ -0,0 +1,73 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.List;
+
+public class PhoneJobResponse {
+
+
+ @SerializedName("request_id")
+ private String requestId;
+ @SerializedName("jobs")
+ private List jobs;
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public List getJobs() {
+ return jobs;
+ }
+
+ public void setJobs(List jobs) {
+ this.jobs = jobs;
+ }
+
+ public static class Jobs {
+ @SerializedName("phone_id")
+ private String phoneId;
+ @SerializedName("job_id")
+ private String jobId;
+ @SerializedName("error_code")
+ private String errorCode;
+ @SerializedName("error_msg")
+ private String errorMsg;
+
+ public String getPhoneId() {
+ return phoneId;
+ }
+
+ public void setPhoneId(String phoneId) {
+ this.phoneId = phoneId;
+ }
+
+ public String getJobId() {
+ return jobId;
+ }
+
+ public void setJobId(String jobId) {
+ this.jobId = jobId;
+ }
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public String getErrorMsg() {
+ return errorMsg;
+ }
+
+ public void setErrorMsg(String errorMsg) {
+ this.errorMsg = errorMsg;
+ }
+ }
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneList.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneList.java
new file mode 100644
index 0000000000000000000000000000000000000000..100b7e461596df0019194f992112024ccb0b1674
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/PhoneList.java
@@ -0,0 +1,84 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+import com.huawei.cloudapp.model.bean.Phone;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PhoneList implements Parcelable {
+
+ @SerializedName("request_id")
+ private String requestId;
+ @SerializedName("count")
+ private int count;
+ @SerializedName("phones")
+ private List phones = new ArrayList<>();
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public List getPhones() {
+ return phones;
+ }
+
+ public void setPhones(List phones) {
+ this.phones = phones;
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.requestId);
+ dest.writeInt(this.count);
+ dest.writeTypedList(this.phones);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.requestId = source.readString();
+ this.count = source.readInt();
+ this.phones = source.createTypedArrayList(Phone.CREATOR);
+ }
+
+ public PhoneList() {
+ }
+
+ protected PhoneList(Parcel in) {
+ this.requestId = in.readString();
+ this.count = in.readInt();
+ this.phones = in.createTypedArrayList(Phone.CREATOR);
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public PhoneList createFromParcel(Parcel source) {
+ return new PhoneList(source);
+ }
+
+ @Override
+ public PhoneList[] newArray(int size) {
+ return new PhoneList[size];
+ }
+ };
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ServerList.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ServerList.java
new file mode 100644
index 0000000000000000000000000000000000000000..de0df06c694036927d241e12d028129e5b1810a0
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/ServerList.java
@@ -0,0 +1,460 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ServerList {
+
+ @SerializedName("request_id")
+ private String requestId;
+ @SerializedName("count")
+ private int count;
+ @SerializedName("servers")
+ private List servers;
+
+ public String getRequestId() {
+ return requestId;
+ }
+
+ public void setRequestId(String requestId) {
+ this.requestId = requestId;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public List getServers() {
+ return servers;
+ }
+
+ public void setServers(List servers) {
+ this.servers = servers;
+ }
+
+ public class Server implements Parcelable {
+
+ public static final String BUNDLE_KEY = "Server_Key";
+
+ @SerializedName("server_name")
+ private String serverName;
+ @SerializedName("server_id")
+ private String serverId;
+ @SerializedName("server_model_name")
+ private String serverModelName;
+ @SerializedName("phone_model_name")
+ private String phoneModelName;
+ @SerializedName("keypair_name")
+ private String keypairName;
+ @SerializedName("status")
+ private int status;
+ @SerializedName("vpc_id")
+ private String vpcId;
+ @SerializedName("cidr")
+ private String cidr;
+ @SerializedName("vpc_cidr")
+ private String vpcCidr;
+ @SerializedName("subnet_id")
+ private String subnetId;
+ @SerializedName("subnet_cidr")
+ private String subnetCidr;
+ @SerializedName("resource_project_id")
+ private String resourceProjectId;
+ @SerializedName("metadata")
+ private Metadata metadata = new Metadata();
+ @SerializedName("availability_zone")
+ private String availabilityZone;
+ @SerializedName("network_version")
+ private String networkVersion;
+ @SerializedName("create_time")
+ private String createTime;
+ @SerializedName("update_time")
+ private String updateTime;
+ @SerializedName("addresses")
+ private List addresses;
+
+ public String getServerName() {
+ return serverName;
+ }
+
+ public void setServerName(String serverName) {
+ this.serverName = serverName;
+ }
+
+ public String getServerId() {
+ return serverId;
+ }
+
+ public void setServerId(String serverId) {
+ this.serverId = serverId;
+ }
+
+ public String getServerModelName() {
+ return serverModelName;
+ }
+
+ public void setServerModelName(String serverModelName) {
+ this.serverModelName = serverModelName;
+ }
+
+ public String getPhoneModelName() {
+ return phoneModelName;
+ }
+
+ public void setPhoneModelName(String phoneModelName) {
+ this.phoneModelName = phoneModelName;
+ }
+
+ public String getKeypairName() {
+ return keypairName;
+ }
+
+ public void setKeypairName(String keypairName) {
+ this.keypairName = keypairName;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public String getVpcId() {
+ return vpcId;
+ }
+
+ public void setVpcId(String vpcId) {
+ this.vpcId = vpcId;
+ }
+
+ public String getCidr() {
+ return cidr;
+ }
+
+ public void setCidr(String cidr) {
+ this.cidr = cidr;
+ }
+
+ public String getVpcCidr() {
+ return vpcCidr;
+ }
+
+ public void setVpcCidr(String vpcCidr) {
+ this.vpcCidr = vpcCidr;
+ }
+
+ public String getSubnetId() {
+ return subnetId;
+ }
+
+ public void setSubnetId(String subnetId) {
+ this.subnetId = subnetId;
+ }
+
+ public String getSubnetCidr() {
+ return subnetCidr;
+ }
+
+ public void setSubnetCidr(String subnetCidr) {
+ this.subnetCidr = subnetCidr;
+ }
+
+ public String getResourceProjectId() {
+ return resourceProjectId;
+ }
+
+ public void setResourceProjectId(String resourceProjectId) {
+ this.resourceProjectId = resourceProjectId;
+ }
+
+ public Metadata getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(Metadata metadata) {
+ this.metadata = metadata;
+ }
+
+ public String getAvailabilityZone() {
+ return availabilityZone;
+ }
+
+ public void setAvailabilityZone(String availabilityZone) {
+ this.availabilityZone = availabilityZone;
+ }
+
+ public String getNetworkVersion() {
+ return networkVersion;
+ }
+
+ public void setNetworkVersion(String networkVersion) {
+ this.networkVersion = networkVersion;
+ }
+
+ public String getCreateTime() {
+ return createTime;
+ }
+
+ public void setCreateTime(String createTime) {
+ this.createTime = createTime;
+ }
+
+ public String getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(String updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ public List getAddresses() {
+ return addresses;
+ }
+
+ public void setAddresses(List addresses) {
+ this.addresses = addresses;
+ }
+
+ public class Metadata implements Parcelable {
+ @SerializedName("product_id")
+ private String productId;
+ @SerializedName("order_id")
+ private String orderId;
+
+ public String getProductId() {
+ return productId;
+ }
+
+ public void setProductId(String productId) {
+ this.productId = productId;
+ }
+
+ public String getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(String orderId) {
+ this.orderId = orderId;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.productId);
+ dest.writeString(this.orderId);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.productId = source.readString();
+ this.orderId = source.readString();
+ }
+
+ public Metadata() {
+ }
+
+ protected Metadata(Parcel in) {
+ this.productId = in.readString();
+ this.orderId = in.readString();
+ }
+
+ public final Creator CREATOR = new Creator() {
+ @Override
+ public Metadata createFromParcel(Parcel source) {
+ return new Metadata(source);
+ }
+
+ @Override
+ public Metadata[] newArray(int size) {
+ return new Metadata[size];
+ }
+ };
+ }
+
+ public class Addresses implements Parcelable {
+ @SerializedName("intranet_ip")
+ private String intranetIp;
+ @SerializedName("server_ip")
+ private String serverIp;
+ @SerializedName("access_ip")
+ private String accessIp;
+ @SerializedName("public_ip")
+ private String publicIp;
+
+ public String getIntranetIp() {
+ return intranetIp;
+ }
+
+ public void setIntranetIp(String intranetIp) {
+ this.intranetIp = intranetIp;
+ }
+
+ public String getServerIp() {
+ return serverIp;
+ }
+
+ public void setServerIp(String serverIp) {
+ this.serverIp = serverIp;
+ }
+
+ public String getAccessIp() {
+ return accessIp;
+ }
+
+ public void setAccessIp(String accessIp) {
+ this.accessIp = accessIp;
+ }
+
+ public String getPublicIp() {
+ return publicIp;
+ }
+
+ public void setPublicIp(String publicIp) {
+ this.publicIp = publicIp;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.intranetIp);
+ dest.writeString(this.serverIp);
+ dest.writeString(this.accessIp);
+ dest.writeString(this.publicIp);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.intranetIp = source.readString();
+ this.serverIp = source.readString();
+ this.accessIp = source.readString();
+ this.publicIp = source.readString();
+ }
+
+ public Addresses() {
+ }
+
+ protected Addresses(Parcel in) {
+ this.intranetIp = in.readString();
+ this.serverIp = in.readString();
+ this.accessIp = in.readString();
+ this.publicIp = in.readString();
+ }
+
+ public final Creator CREATOR = new Creator() {
+ @Override
+ public Addresses createFromParcel(Parcel source) {
+ return new Addresses(source);
+ }
+
+ @Override
+ public Addresses[] newArray(int size) {
+ return new Addresses[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.serverName);
+ dest.writeString(this.serverId);
+ dest.writeString(this.serverModelName);
+ dest.writeString(this.phoneModelName);
+ dest.writeString(this.keypairName);
+ dest.writeInt(this.status);
+ dest.writeString(this.vpcId);
+ dest.writeString(this.cidr);
+ dest.writeString(this.vpcCidr);
+ dest.writeString(this.subnetId);
+ dest.writeString(this.subnetCidr);
+ dest.writeString(this.resourceProjectId);
+ dest.writeParcelable(this.metadata, flags);
+ dest.writeString(this.availabilityZone);
+ dest.writeString(this.networkVersion);
+ dest.writeString(this.createTime);
+ dest.writeString(this.updateTime);
+ dest.writeList(this.addresses);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.serverName = source.readString();
+ this.serverId = source.readString();
+ this.serverModelName = source.readString();
+ this.phoneModelName = source.readString();
+ this.keypairName = source.readString();
+ this.status = source.readInt();
+ this.vpcId = source.readString();
+ this.cidr = source.readString();
+ this.vpcCidr = source.readString();
+ this.subnetId = source.readString();
+ this.subnetCidr = source.readString();
+ this.resourceProjectId = source.readString();
+ this.metadata = source.readParcelable(Metadata.class.getClassLoader());
+ this.availabilityZone = source.readString();
+ this.networkVersion = source.readString();
+ this.createTime = source.readString();
+ this.updateTime = source.readString();
+ this.addresses = new ArrayList();
+ source.readList(this.addresses, Addresses.class.getClassLoader());
+ }
+
+ public Server() {
+ }
+
+ protected Server(Parcel in) {
+ this.serverName = in.readString();
+ this.serverId = in.readString();
+ this.serverModelName = in.readString();
+ this.phoneModelName = in.readString();
+ this.keypairName = in.readString();
+ this.status = in.readInt();
+ this.vpcId = in.readString();
+ this.cidr = in.readString();
+ this.vpcCidr = in.readString();
+ this.subnetId = in.readString();
+ this.subnetCidr = in.readString();
+ this.resourceProjectId = in.readString();
+ this.metadata = in.readParcelable(Metadata.class.getClassLoader());
+ this.availabilityZone = in.readString();
+ this.networkVersion = in.readString();
+ this.createTime = in.readString();
+ this.updateTime = in.readString();
+ this.addresses = new ArrayList();
+ in.readList(this.addresses, Addresses.class.getClassLoader());
+ }
+
+ public final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public Server createFromParcel(Parcel source) {
+ return new Server(source);
+ }
+
+ @Override
+ public Server[] newArray(int size) {
+ return new Server[size];
+ }
+ };
+ }
+
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/bean/direct/UserToken.java b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/UserToken.java
new file mode 100644
index 0000000000000000000000000000000000000000..631c93e52bc076f539da3662e9c94b7526d4a27f
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/direct/UserToken.java
@@ -0,0 +1,447 @@
+package com.huawei.cloudapp.model.bean.direct;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class UserToken implements Parcelable {
+
+ @SerializedName("auth")
+ private AuthDTO auth = new AuthDTO();
+
+ public AuthDTO getAuth() {
+ return auth;
+ }
+
+ public void setAuth(AuthDTO auth) {
+ this.auth = auth;
+ }
+
+ public static class AuthDTO implements Parcelable {
+ @SerializedName("identity")
+ private IdentityDTO identity = new IdentityDTO();
+ @SerializedName("scope")
+ private ScopeDTO scope = new ScopeDTO();
+
+ public IdentityDTO getIdentity() {
+ return identity;
+ }
+
+ public void setIdentity(IdentityDTO identity) {
+ this.identity = identity;
+ }
+
+ public ScopeDTO getScope() {
+ return scope;
+ }
+
+ public void setScope(ScopeDTO scope) {
+ this.scope = scope;
+ }
+
+ public static class IdentityDTO implements Parcelable {
+ @SerializedName("password")
+ private PasswordDTO password = new PasswordDTO();
+ @SerializedName("methods")
+ private List methods = new ArrayList<>();
+
+ public PasswordDTO getPassword() {
+ return password;
+ }
+
+ public void setPassword(PasswordDTO password) {
+ this.password = password;
+ }
+
+ public List getMethods() {
+ return methods;
+ }
+
+ public void setMethods(List methods) {
+ this.methods = methods;
+ }
+
+ public static class PasswordDTO implements Parcelable {
+ @SerializedName("user")
+ private UserDTO user = new UserDTO();
+
+ public UserDTO getUser() {
+ return user;
+ }
+
+ public void setUser(UserDTO user) {
+ this.user = user;
+ }
+
+ public static class UserDTO implements Parcelable {
+ @SerializedName("domain")
+ private DomainDTO domain = new DomainDTO();
+ @SerializedName("name")
+ private String name;
+ @SerializedName("password")
+ private String password;
+
+ public DomainDTO getDomain() {
+ return domain;
+ }
+
+ public void setDomain(DomainDTO domain) {
+ this.domain = domain;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public static class DomainDTO implements Parcelable {
+ @SerializedName("name")
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.name);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.name = source.readString();
+ }
+
+ public DomainDTO() {
+ }
+
+ protected DomainDTO(Parcel in) {
+ this.name = in.readString();
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public DomainDTO createFromParcel(Parcel source) {
+ return new DomainDTO(source);
+ }
+
+ @Override
+ public DomainDTO[] newArray(int size) {
+ return new DomainDTO[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(this.domain, flags);
+ dest.writeString(this.name);
+ dest.writeString(this.password);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.domain = source.readParcelable(DomainDTO.class.getClassLoader());
+ this.name = source.readString();
+ this.password = source.readString();
+ }
+
+ public UserDTO() {
+ }
+
+ protected UserDTO(Parcel in) {
+ this.domain = in.readParcelable(DomainDTO.class.getClassLoader());
+ this.name = in.readString();
+ this.password = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public UserDTO createFromParcel(Parcel source) {
+ return new UserDTO(source);
+ }
+
+ @Override
+ public UserDTO[] newArray(int size) {
+ return new UserDTO[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(this.user, flags);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.user = source.readParcelable(UserDTO.class.getClassLoader());
+ }
+
+ public PasswordDTO() {
+ }
+
+ protected PasswordDTO(Parcel in) {
+ this.user = in.readParcelable(UserDTO.class.getClassLoader());
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public PasswordDTO createFromParcel(Parcel source) {
+ return new PasswordDTO(source);
+ }
+
+ @Override
+ public PasswordDTO[] newArray(int size) {
+ return new PasswordDTO[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(this.password, flags);
+ dest.writeStringList(this.methods);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.password = source.readParcelable(PasswordDTO.class.getClassLoader());
+ this.methods = source.createStringArrayList();
+ }
+
+ public IdentityDTO() {
+ }
+
+ protected IdentityDTO(Parcel in) {
+ this.password = in.readParcelable(PasswordDTO.class.getClassLoader());
+ this.methods = in.createStringArrayList();
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public IdentityDTO createFromParcel(Parcel source) {
+ return new IdentityDTO(source);
+ }
+
+ @Override
+ public IdentityDTO[] newArray(int size) {
+ return new IdentityDTO[size];
+ }
+ };
+ }
+
+ public static class ScopeDTO implements Parcelable {
+ @SerializedName("project")
+ private ProjectDTO project = new ProjectDTO();
+
+ @SerializedName("domain")
+ private IdentityDTO.PasswordDTO.UserDTO.DomainDTO domain = new IdentityDTO.PasswordDTO.UserDTO.DomainDTO();
+
+ public ProjectDTO getProject() {
+ return project;
+ }
+
+ public void setProject(ProjectDTO project) {
+ this.project = project;
+ }
+
+ public IdentityDTO.PasswordDTO.UserDTO.DomainDTO getDomain() {
+ return domain;
+ }
+
+ public void setDomain(IdentityDTO.PasswordDTO.UserDTO.DomainDTO domain) {
+ this.domain = domain;
+ }
+
+ public static class ProjectDTO implements Parcelable {
+ @SerializedName("name")
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(this.name);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.name = source.readString();
+ }
+
+ public ProjectDTO() {
+ }
+
+ protected ProjectDTO(Parcel in) {
+ this.name = in.readString();
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public ProjectDTO createFromParcel(Parcel source) {
+ return new ProjectDTO(source);
+ }
+
+ @Override
+ public ProjectDTO[] newArray(int size) {
+ return new ProjectDTO[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(this.project, flags);
+ dest.writeParcelable(this.domain, flags);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.project = source.readParcelable(ProjectDTO.class.getClassLoader());
+ this.domain = source.readParcelable(IdentityDTO.PasswordDTO.UserDTO.DomainDTO.class.getClassLoader());
+ }
+
+ public ScopeDTO() {
+ }
+
+ protected ScopeDTO(Parcel in) {
+ this.project = in.readParcelable(ProjectDTO.class.getClassLoader());
+ this.domain = in.readParcelable(IdentityDTO.PasswordDTO.UserDTO.DomainDTO.class.getClassLoader());
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public ScopeDTO createFromParcel(Parcel source) {
+ return new ScopeDTO(source);
+ }
+
+ @Override
+ public ScopeDTO[] newArray(int size) {
+ return new ScopeDTO[size];
+ }
+ };
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(this.identity, flags);
+ dest.writeParcelable(this.scope, flags);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.identity = source.readParcelable(IdentityDTO.class.getClassLoader());
+ this.scope = source.readParcelable(ScopeDTO.class.getClassLoader());
+ }
+
+ public AuthDTO() {
+ }
+
+ protected AuthDTO(Parcel in) {
+ this.identity = in.readParcelable(IdentityDTO.class.getClassLoader());
+ this.scope = in.readParcelable(ScopeDTO.class.getClassLoader());
+ }
+
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public AuthDTO createFromParcel(Parcel source) {
+ return new AuthDTO(source);
+ }
+
+ @Override
+ public AuthDTO[] newArray(int size) {
+ return new AuthDTO[size];
+ }
+ };
+ }
+
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeParcelable(this.auth, flags);
+ }
+
+ public void readFromParcel(Parcel source) {
+ this.auth = source.readParcelable(AuthDTO.class.getClassLoader());
+ }
+
+ public UserToken() {
+ }
+
+ protected UserToken(Parcel in) {
+ this.auth = in.readParcelable(AuthDTO.class.getClassLoader());
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public UserToken createFromParcel(Parcel source) {
+ return new UserToken(source);
+ }
+
+ @Override
+ public UserToken[] newArray(int size) {
+ return new UserToken[size];
+ }
+ };
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/common/CasConnectInfo.java b/app/src/main/java/com/huawei/cloudapp/model/bean/management/CasConnectInfo.java
similarity index 98%
rename from app/src/main/java/com/huawei/cloudapp/common/CasConnectInfo.java
rename to app/src/main/java/com/huawei/cloudapp/model/bean/management/CasConnectInfo.java
index 555a99c54d9dd4054c00aa3331891f67a80dd311..bb1ad75687fa4f9f0b63de526421ac9be391e8e1 100644
--- a/app/src/main/java/com/huawei/cloudapp/common/CasConnectInfo.java
+++ b/app/src/main/java/com/huawei/cloudapp/model/bean/management/CasConnectInfo.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.huawei.cloudapp.common;
+package com.huawei.cloudapp.model.bean.management;
import android.os.Parcel;
import android.os.Parcelable;
@@ -35,6 +35,8 @@ 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 com.huawei.cloudapp.common.CASLog;
+
public class CasConnectInfo implements Parcelable {
public static final String BUNDLE_KEY = "CasConnectorInfo_Key";
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
new file mode 100644
index 0000000000000000000000000000000000000000..4e41d716e0c60ed7a6dc40e214e5174680506ef4
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/direct/ConnectInfoModel.java
@@ -0,0 +1,187 @@
+package com.huawei.cloudapp.model.direct;
+
+import static com.huawei.cloudapp.utils.CasConstantsUtil.X_AUTH_TOKEN;
+import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
+import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
+import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR;
+import static java.net.HttpURLConnection.HTTP_OK;
+import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import com.huawei.cloudapp.model.IConnectInfoModel;
+import com.huawei.cloudapp.model.OnRequestListener;
+import com.huawei.cloudapp.model.bean.CustomException;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.direct.ConnectInfos;
+import com.huawei.cloudapp.model.bean.direct.CPHError;
+import com.huawei.cloudapp.model.bean.management.CasConnectInfo;
+import com.huawei.cloudapp.utils.CasHttpUtils;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.UUID;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+public class ConnectInfoModel implements IConnectInfoModel {
+ private static final String TAG = "ConnectInfoModel";
+ private String mRequestBodyJson;
+ @Override
+ public void getConnectInfo(User user, String phoneId, String region, OnRequestListener onRequestListener) {
+ String url = "https://cph." + region + ".myhuaweicloud.com/v1/"+
+ user.getUserProjectId().get(region) + "/cloud-phone/phones/batch-connection";
+ String userTokenExpireTime = user.getUserTokenExpireTimeByRegion(region);
+ if (userTokenExpireTime == null || userTokenExpireTime.isEmpty()
+ || Long.parseLong(userTokenExpireTime) < System.currentTimeMillis()) {
+ onRequestListener.onFailure(new CustomException.TokenExpireException());
+ return;
+ }
+ Log.d(TAG, "url: " + url);
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(X_AUTH_TOKEN, user.getUserTokenByRegion(region));
+ HashMap body = new HashMap<>();
+ body.put("phone_ids", Collections.singletonList(phoneId));
+ body.put("client_type", "ANDROID");
+ Gson gson = new Gson();
+ mRequestBodyJson = gson.toJson(body);
+ Log.d(TAG, "getConnectInfo: " + mRequestBodyJson);
+ CasHttpUtils.post(url, requestHeader, mRequestBodyJson, new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+ try {
+ onRequestListener.onSuccess(parseResponseToConnectInfo(response), 1);
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public List parseResponseToConnectInfo(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ String rspJsonStr = response.body().string();
+ Gson gson = new Gson();
+ if (response.code() == HTTP_OK) {
+ if (rspJsonStr.isEmpty()){
+ Log.e(TAG, "Failed to get start param response.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+
+ ConnectInfos rsp;
+ try {
+ rsp = gson.fromJson(rspJsonStr, ConnectInfos.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "handleGetConnectInfoResponse: Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.FailedToGetConnectInfoException();
+ }
+ if (rsp == null) {
+ Log.e(TAG, "handleGetConnectInfoResponse: Failed to get rsp from json. " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetConnectInfoException();
+ }
+ Log.d(TAG, "rsp: " + rspJsonStr);
+ //当前接口只会请求一个手机的信息,所以只需要判断一次。
+ if (!rsp.getErrors().isEmpty()) {
+ Log.e(TAG, "Failed to get connect info, : " + rsp.getErrors().get(0).getErrorMsg());
+ 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()));
+ } else {
+ CPHError rsp;
+ try {
+ rsp = gson.fromJson(rspJsonStr, CPHError.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+
+ if (response.code() == HTTP_BAD_REQUEST || response.code() == HTTP_INTERNAL_ERROR) {
+ if (rsp.getErrorCode().equals("CPS.0004")) {
+ Log.e(TAG, "Phone id is invalid, request body :" + mRequestBodyJson + ", rsp: " + rspJsonStr);
+ throw new CustomException.ParamInvalidException();
+ } else if (rsp.getErrorCode().equals("CPS.0358")) {
+ Log.e(TAG, "client_type is invalid, request body :" + mRequestBodyJson + ", rsp: " + rspJsonStr);
+ throw new CustomException.ParamInvalidException();
+ } else if (rsp.getErrorCode().equals("CPS.0359")) {
+ Log.e(TAG, "Phone id size is over max limit, request body :" + mRequestBodyJson + ", rsp: " + rspJsonStr);
+ throw new CustomException.ParamInvalidException();
+ } else {
+ Log.e(TAG, "handleGetConnectInfoResponse: " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetConnectInfoException(rspJsonStr);
+ }
+ } else if (response.code() == HTTP_UNAUTHORIZED) {
+ if (rsp.getErrorCode().equals("APIGW.0301") || rsp.getErrorCode().equals("APIGW.0307")) {
+ Log.e(TAG, "Token is invalid, need get new token. ");
+ throw new CustomException.TokenExpireException();
+ } else if (rsp.getErrorCode().equals("APIGW.0303") || rsp.getErrorCode().equals("APIGW.0305")) {
+ Log.e(TAG, "Check whether the account has the permission to request APIs.");
+ throw new CustomException.NoPermissionException();
+ } else {
+ Log.e(TAG, "Failed to get connect info, " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetConnectInfoException(rspJsonStr);
+ }
+ } else if (response.code() == HTTP_FORBIDDEN) {
+ if (rsp.getErrorCode().equals("APIGW.0302") || rsp.getErrorCode().equals("APIGW.0304") || rsp.getErrorCode().equals("APIGW.0306")) {
+ Log.e(TAG, "Check whether the account has the permission to request APIs.");
+ throw new CustomException.NoPermissionException();
+ } else {
+ Log.e(TAG, "Failed to get connect info, : " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetConnectInfoException(rspJsonStr);
+ }
+ } else {
+ Log.e(TAG, "Failed to get connect info, : " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetConnectInfoException(rspJsonStr);
+ }
+ }
+ }
+
+ public CasConnectInfo GenerateConnectInfo(String ip,
+ String port,
+ String sessionId,
+ String ticket,
+ String aesKey,
+ String timestamp) throws Exception {
+ if (ip.isEmpty() || port.isEmpty()) {
+ throw new CustomException.ConnectInfoErrorException();
+ }
+ if (sessionId.isEmpty()) {
+ sessionId = UUID.randomUUID().toString().replaceAll("-", "");
+ }
+ CasConnectInfo connectorInfo = new CasConnectInfo();
+ connectorInfo.setConnectIp(ip);
+ connectorInfo.setConnectPort(port);
+ connectorInfo.setBackgroundTimeout("60");
+ connectorInfo.setAvailablePlayTime("0");
+ connectorInfo.setSessionId(sessionId);
+ connectorInfo.setTicket(ticket);
+ connectorInfo.setAesKey(aesKey);
+ connectorInfo.setAuthTs(timestamp);
+ connectorInfo.setTouchTimeout("0");
+
+ return connectorInfo;
+ }
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/direct/PhoneModel.java b/app/src/main/java/com/huawei/cloudapp/model/direct/PhoneModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..a322aabe302b33d20929db45a351f69fc4f47f6f
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/direct/PhoneModel.java
@@ -0,0 +1,393 @@
+package com.huawei.cloudapp.model.direct;
+
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PHONE_NAME;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.SERVER_ID;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.STATUS;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.X_AUTH_TOKEN;
+
+import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
+import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
+import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR;
+import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
+import static java.net.HttpURLConnection.HTTP_OK;
+import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import com.huawei.cloudapp.model.IPhoneModel;
+import com.huawei.cloudapp.model.OnRequestListener;
+import com.huawei.cloudapp.model.bean.CustomException;
+import com.huawei.cloudapp.model.bean.direct.PhoneJobRequest;
+import com.huawei.cloudapp.model.bean.direct.CPHError;
+import com.huawei.cloudapp.model.bean.direct.PhoneDetail;
+import com.huawei.cloudapp.model.bean.direct.PhoneList;
+import com.huawei.cloudapp.model.bean.Phone;
+import com.huawei.cloudapp.model.bean.PhoneInfo;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.direct.PhoneJobResponse;
+import com.huawei.cloudapp.utils.CasConstantsUtil;
+import com.huawei.cloudapp.utils.CasHttpUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.HttpUrl;
+import okhttp3.Response;
+
+public class PhoneModel implements IPhoneModel {
+ private static final String TAG = "PhoneModel";
+ private String mRegion;
+ private int mTotalCount;
+ private String mUrl;
+ @Override
+ public void getPhoneList(User user, HashMap condition, String region, String projectId, int offset, int limit, OnRequestListener onRequestListener) {
+ String userTokenExpireTime = user.getUserTokenExpireTimeByRegion(region);
+ if (userTokenExpireTime == null || userTokenExpireTime.isEmpty()
+ || Long.parseLong(userTokenExpireTime) + 5000 < System.currentTimeMillis()) {
+ onRequestListener.onFailure(new CustomException.TokenExpireException());
+ return;
+ }
+ mRegion = region;
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(X_AUTH_TOKEN, user.getUserTokenByRegion(region));
+ CasHttpUtils.get(getRequestPhoneListUrl(condition, region, projectId, offset, limit), requestHeader, new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+ try {
+ onRequestListener.onSuccess(parseResponseToPhoneList(response), mTotalCount);
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void getPhoneDetailInfo(User user, String region, String projectId, String phoneId, OnRequestListener onRequestListener) {
+ String userTokenExpireTime = user.getUserTokenExpireTimeByRegion(region);
+ if (userTokenExpireTime == null || userTokenExpireTime.isEmpty()
+ || Long.parseLong(userTokenExpireTime) + 5000 < System.currentTimeMillis()) {
+ onRequestListener.onFailure(new CustomException.TokenExpireException());
+ return;
+ }
+ mRegion = region;
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(X_AUTH_TOKEN, user.getUserTokenByRegion(region));
+ CasHttpUtils.get(getRequestPhoneDetailUrl(region, projectId, phoneId), requestHeader, new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+ try {
+ onRequestListener.onSuccess(parseResponseToPhoneDetail(response), 1);
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void resetPhone(User user,
+ String region,
+ String projectId,
+ List phoneIdList,
+ String imageId,
+ List> property,
+ OnRequestListener onRequestListener) {
+ doRestartOrResetPhone(false, user, region, projectId, phoneIdList, imageId, property, onRequestListener);
+ }
+
+
+ @Override
+ public void restartPhone(User user,
+ String region,
+ String projectId,
+ List phoneIdList,
+ String imageId,
+ List> property,
+ OnRequestListener onRequestListener) {
+
+ doRestartOrResetPhone(true, user, region, projectId, phoneIdList, imageId, property, onRequestListener);
+ }
+
+
+ private void doRestartOrResetPhone(boolean isRestart,
+ User user,
+ String region,
+ String projectId,
+ List phoneIdList,
+ String imageId,
+ List> property,
+ OnRequestListener onRequestListener) {
+ String userTokenExpireTime = user.getUserTokenExpireTimeByRegion(region);
+ if (userTokenExpireTime == null || userTokenExpireTime.isEmpty()
+ || Long.parseLong(userTokenExpireTime) + 5000 < System.currentTimeMillis()) {
+ onRequestListener.onFailure(new CustomException.TokenExpireException());
+ return;
+ }
+ mRegion = region;
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(X_AUTH_TOKEN, user.getUserTokenByRegion(region));
+
+ PhoneJobRequest phoneJob = new PhoneJobRequest();
+ if (property == null) {
+ for (int i = 0; i < phoneIdList.size(); i++) {
+ phoneJob.getPhones().add(new PhoneJobRequest.PhoneProperty(phoneIdList.get(i), null));
+ }
+ } else {
+ for (int i = 0; i < phoneIdList.size(); i++) {
+ phoneJob.getPhones().add(new PhoneJobRequest.PhoneProperty(phoneIdList.get(i), property.get(i).toString()));
+ }
+ }
+ Gson gson = new Gson();
+ String bodyStr = gson.toJson(phoneJob);
+ String url = isRestart ? getRequestPhoneRestartUrl(region, projectId) : getRequestPhoneResetUrl(region, projectId);
+ CasHttpUtils.post(url, requestHeader, bodyStr, new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+ try {
+ List jobs = parseResponseToPhoneRestartOrResetJob(response);
+ onRequestListener.onSuccess(jobs, jobs.size());
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+
+ private List parseResponseToPhoneList(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ String rspJsonStr = response.body().string();
+ Gson gson = new Gson();
+ List phoneInfoList = new ArrayList<>();
+ if (response.code() == HTTP_OK) {
+ PhoneList rsp;
+ try {
+ rsp = gson.fromJson(rspJsonStr, PhoneList.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+ if (rsp == null) {
+ Log.e(TAG, "Failed to get rsp from json. " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+ mTotalCount = rsp.getCount();
+ for (Phone phone : rsp.getPhones()) {
+ //获取phone model规格
+ phoneInfoList.add(new PhoneInfo(phone, "", CasConstantsUtil.REGION_INFO.get(mRegion)));
+ }
+ } else {
+ CPHError rsp;
+ try {
+ rsp = gson.fromJson(rspJsonStr, CPHError.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+ handleCommonErrorResponse(response, rsp);
+ Log.e(TAG, "Failed to get phone list. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+ return phoneInfoList;
+ }
+
+ private List parseResponseToPhoneDetail(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ String rspJsonStr = response.body().string();
+ Gson gson = new Gson();
+ PhoneDetail phoneDetail = null;
+ if (response.code() == HTTP_OK) {
+ try {
+ phoneDetail = gson.fromJson(rspJsonStr, PhoneDetail.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneDetailException();
+ }
+ if (phoneDetail == null) {
+ Log.e(TAG, "Failed to get rsp from json. " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneDetailException();
+ }
+ } else {
+ CPHError rsp;
+ try {
+ rsp = gson.fromJson(rspJsonStr, CPHError.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneDetailException();
+ }
+ handleCommonErrorResponse(response, rsp);
+ Log.e(TAG, "Failed to get phone detail. " + rspJsonStr);
+ throw new CustomException.FailedToGetPhoneDetailException();
+
+ }
+ return Collections.singletonList(phoneDetail);
+ }
+
+ private List parseResponseToPhoneRestartOrResetJob(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ String rspJsonStr = response.body().string();
+ Gson gson = new Gson();
+ PhoneJobResponse phoneJob = null;
+ Log.e(TAG, "rsp: " + rspJsonStr);
+ if (response.code() == HTTP_OK) {
+ try {
+ phoneJob = gson.fromJson(rspJsonStr, PhoneJobResponse.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.DeliverJobFailedException();
+ }
+ if (phoneJob == null) {
+ Log.e(TAG, "Failed to get rsp from json. " + response.code() + ", " + rspJsonStr);
+ throw new CustomException.DeliverJobFailedException();
+ }
+ } else {
+ CPHError rsp;
+ try {
+ rsp = gson.fromJson(rspJsonStr, CPHError.class);
+ } catch (JsonSyntaxException e) {
+ Log.e(TAG, "Failed to parse rsp json. " + rspJsonStr);
+ throw new CustomException.DeliverJobFailedException();
+ }
+ handleCommonErrorResponse(response, rsp);
+ Log.e(TAG, "Failed to delivering job. " + rspJsonStr);
+ throw new CustomException.DeliverJobFailedException();
+
+ }
+ return Collections.singletonList(phoneJob);
+ }
+
+ private void handleCommonErrorResponse(Response response, CPHError rsp) throws IOException {
+ if (response.code() == HTTP_BAD_REQUEST) {
+ if (rsp.getErrorCode().equals("CPS.0025")) {
+ Log.e(TAG, "Phone name is invalid, rsp: " + response.code() + ", " + rsp.getErrorCode() + ", " + rsp.getErrorMsg()+ ", " + rsp.getRequestId());
+ throw new CustomException.ParamInvalidException();
+ } else if (rsp.getErrorCode().equals("CPS.0086")) {
+ Log.e(TAG, "Server id is invalid, rsp: " + response.code() + ", " + rsp.getErrorCode() + ", " + rsp.getErrorMsg()+ ", " + rsp.getRequestId());
+ throw new CustomException.ParamInvalidException();
+ }
+ } else if (response.code() == HTTP_UNAUTHORIZED) {
+ if (rsp.getErrorCode().equals("APIGW.0301") || rsp.getErrorCode().equals("APIGW.0307")) {
+ Log.e(TAG, "Token is invalid, need get new token. ");
+ throw new CustomException.TokenExpireException();
+ } else if (rsp.getErrorCode().equals("APIGW.0303") || rsp.getErrorCode().equals("APIGW.0305")) {
+ Log.e(TAG, "Check whether the account has the permission to request APIs.");
+ throw new CustomException.NoPermissionException();
+ }
+ } else if (response.code() == HTTP_FORBIDDEN) {
+ switch (rsp.getErrorCode()) {
+ case "APIGW.0302":
+ case "APIGW.0304":
+ case "APIGW.0306":
+ case "CPS.0001":
+ Log.e(TAG, "Check whether the account has the permission to request APIs.");
+ throw new CustomException.NoPermissionException();
+ case "CPS.0006":
+ Log.e(TAG, "Role is op_restricted. ");
+ throw new CustomException.OpRestrictedException();
+ case "CPS.0007":
+ Log.e(TAG, "Role is op_suspended. ");
+ throw new CustomException.OpSuspendedException();
+ case "CPS.0008":
+ Log.e(TAG, "Role is op_unverified.");
+ throw new CustomException.OpUnverifiedException();
+ }
+ } else if (response.code() == HTTP_NOT_FOUND) {
+ switch (rsp.getErrorCode()) {
+ case "CPS.0005":
+ Log.e(TAG, "Phone not found.");
+ throw new CustomException.PhoneNotFoundException();
+ case "CPS.0011":
+ Log.e(TAG, "job not found. ");
+ throw new CustomException.JobNotFoundException();
+ case "CPS.0015":
+ Log.e(TAG, "Server not found. ");
+ throw new CustomException.ServerNotFoundException();
+ case "CPS.0243":
+ Log.e(TAG, "User not found.");
+ throw new CustomException.UserNotFoundException();
+ case "CPS.0302":
+ Log.e(TAG, "User not found.");
+ throw new CustomException.ResourceNotFoundException();
+ }
+ } else if (response.code() == HTTP_INTERNAL_ERROR) {
+ Log.e(TAG, "Service internal error.");
+ throw new CustomException.ServerError();
+ }
+ }
+
+ private String getRequestPhoneListUrl(HashMap condition, String region, String projectId, int offset, int limit) {
+ HttpUrl.Builder urlBuilder = HttpUrl.parse("https://cph." + region + ".myhuaweicloud.com/v1/"+ projectId + "/cloud-phone/phones").newBuilder();
+
+ if (offset >= 0) {
+ urlBuilder.addQueryParameter("offset", String.valueOf(offset));
+ }
+
+ if (limit > 0) {
+ urlBuilder.addQueryParameter("limit", String.valueOf(limit));
+ }
+
+ if (condition != null) {
+ if (condition.containsKey("server_id")) {
+ urlBuilder.addQueryParameter("server_id", condition.get(SERVER_ID));
+ }
+ if (condition.containsKey("phone_name")) {
+ urlBuilder.addQueryParameter("phone_name", condition.get(PHONE_NAME));
+ }
+ if (condition.containsKey("status")) {
+ urlBuilder.addQueryParameter("status", condition.get(STATUS));
+ }
+ }
+ mUrl = urlBuilder.build().toString();
+ return mUrl;
+ }
+ private String getRequestPhoneDetailUrl(String region, String projectId, String phoneId) {
+ HttpUrl.Builder urlBuilder = HttpUrl.parse("https://cph." + region + ".myhuaweicloud.com/v1/"+ projectId + "/cloud-phone/phones/" + phoneId).newBuilder();
+ mUrl = urlBuilder.build().toString();
+ return mUrl;
+ }
+ private String getRequestPhoneRestartUrl(String region, String projectId) {
+ HttpUrl.Builder urlBuilder = HttpUrl.parse("https://cph." + region + ".myhuaweicloud.com/v1/"+ projectId + "/cloud-phone/phones/batch-restart").newBuilder();
+ mUrl = urlBuilder.build().toString();
+ return mUrl;
+ }
+ private String getRequestPhoneResetUrl(String region, String projectId) {
+ HttpUrl.Builder urlBuilder = HttpUrl.parse("https://cph." + region + ".myhuaweicloud.com/v1/"+ projectId + "/cloud-phone/phones/batch-reset").newBuilder();
+ mUrl = urlBuilder.build().toString();
+ return mUrl;
+ }
+
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/direct/ServerModel.java b/app/src/main/java/com/huawei/cloudapp/model/direct/ServerModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..5c2080314122b160c37f1c7a7a131da618212d6f
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/direct/ServerModel.java
@@ -0,0 +1,91 @@
+package com.huawei.cloudapp.model.direct;
+
+import static com.huawei.cloudapp.utils.CasConstantsUtil.X_AUTH_TOKEN;
+import static java.net.HttpURLConnection.HTTP_OK;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.huawei.cloudapp.model.OnRequestListener;
+import com.huawei.cloudapp.model.bean.CustomException;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.direct.ServerList;
+import com.huawei.cloudapp.utils.CasHttpUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+public class ServerModel {
+ private static final String TAG = "ServerModel";
+ private int mTotalCount;
+
+ public void getServerList(User user, String region, String projectId, int offset, int limit, OnRequestListener onRequestListener) {
+ if (Long.parseLong(user.getUserTokenExpireTimeByRegion(region)) < System.currentTimeMillis()) {
+ onRequestListener.onFailure(new CustomException.TokenExpireException());
+ return;
+ }
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(X_AUTH_TOKEN, user.getUserTokenByRegion(region));
+ CasHttpUtils.get(getRequestUrl(region, projectId, offset, limit), requestHeader, new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
+ try {
+ onRequestListener.onSuccess(parseResponseToPhoneList(response), mTotalCount);
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+ public List parseResponseToPhoneList(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ List serverList = new ArrayList<>();
+ if (response.code() == HTTP_OK) {
+ String rspJsonStr = response.body().string();
+ Gson gson = new Gson();
+ ServerList rsp = gson.fromJson(rspJsonStr, ServerList.class);
+ if (rsp == null) {
+ Log.e(TAG, "handleGetPhoneListResponse: Failed to get rsp from json. " + response.code() + ", " + response.body().string());
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+ mTotalCount = rsp.getCount();
+ serverList = rsp.getServers();
+ if (serverList.size() == 0) {
+ throw new CustomException.GetServerListEmptyException();
+ }
+ } else {
+ Log.e(TAG, "handleGetPhoneListResponse: " + response.code() + ", " + response.body().string());
+ throw new CustomException.FailedToGetPhoneListException();
+ }
+ return serverList;
+ }
+
+ public String getRequestUrl(String region, String projectId, int offset, int limit) {
+ String url = "https://cph." + region + ".myhuaweicloud.com" + "/v1/" + projectId +"/cloud-phone/servers";
+ if (offset >= 0) {
+ url += "?offset=" + offset;
+ }
+
+ if (limit > 0) {
+ url += "&limit=" + limit;
+ }
+ return url;
+ }
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/direct/UserModel.java b/app/src/main/java/com/huawei/cloudapp/model/direct/UserModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..d15918c9b0f890f8282c105a4b44e3ac933cd7cc
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/direct/UserModel.java
@@ -0,0 +1,140 @@
+package com.huawei.cloudapp.model.direct;
+
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PASSWORD;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.TOKEN;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.X_SUBJECT_TOKEN;
+
+import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
+import static java.net.HttpURLConnection.HTTP_CREATED;
+import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
+import static java.net.HttpURLConnection.HTTP_INTERNAL_ERROR;
+import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
+import static java.net.HttpURLConnection.HTTP_UNAUTHORIZED;
+import static java.net.HttpURLConnection.HTTP_UNAVAILABLE;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.huawei.cloudapp.model.OnRequestListener;
+import com.huawei.cloudapp.model.IUserModel;
+import com.huawei.cloudapp.model.bean.CustomException;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.direct.UserToken;
+import com.huawei.cloudapp.utils.CasHttpUtils;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+public class UserModel implements IUserModel {
+
+ public static final String TAG = "UserModel";
+ private static final String IAM_URL = "https://iam.myhuaweicloud.com/v3/auth/tokens?nocatalog=true";
+ private User mUser;
+ private String mRegion;
+
+ @Override
+ public void getUser(User user, String password, String region, OnRequestListener onRequestListener) {
+ Map header = new HashMap<>();
+ header.put("Content-Type", "application/json;charset=utf8");
+ Gson gson = new Gson();
+ UserToken userTokenRequest = new UserToken();
+ userTokenRequest.getAuth().getIdentity().getMethods().add(PASSWORD);
+ userTokenRequest.getAuth().getIdentity().getPassword().getUser().getDomain().setName(user.getUsername());
+ userTokenRequest.getAuth().getIdentity().getPassword().getUser().setName(user.getIamUsername());
+ userTokenRequest.getAuth().getIdentity().getPassword().getUser().setPassword(password);
+ userTokenRequest.getAuth().getScope().getProject().setName(region);
+ String userTokenRequestJson = gson.toJson(userTokenRequest);
+ CasHttpUtils.post(IAM_URL, header, userTokenRequestJson, new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+ try {
+ onRequestListener.onSuccess(parseResponseToUser(response), 1);
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ mUser = user;
+ mRegion = region;
+ }
+
+ @Override
+ public List parseResponseToUser(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ String tokenStr, tokenExpireTimeStr, projectId = null;
+ if (response.code() == HTTP_CREATED) {
+ tokenStr = response.header(X_SUBJECT_TOKEN);
+ if (tokenStr == null || tokenStr.isEmpty()) {
+ Log.e(TAG, "Failed to get token.");
+ throw new CustomException.FailedToGetTokenException();
+ }
+ String rspStr = response.body().string();
+ if (rspStr.isEmpty()) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.FailedToGetTokenException();
+ }
+ Gson gson = new Gson();
+ JsonObject jsonObject = gson.fromJson(rspStr, JsonObject.class);
+ String tokenExpireTime = jsonObject.get(TOKEN).getAsJsonObject().get("expires_at").getAsString();
+ if (tokenExpireTime == null || tokenExpireTime.isEmpty()) {
+ Log.e(TAG, "Failed to token expire time.");
+ throw new CustomException.FailedToGetTokenException();
+ }
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ format.setTimeZone(TimeZone.getTimeZone("UTC"));
+ Date date = format.parse(tokenExpireTime);
+ tokenExpireTimeStr = String.valueOf(date.getTime());
+
+ projectId = jsonObject.get(TOKEN).getAsJsonObject().get("project").getAsJsonObject().get("id").getAsString();
+ Log.e(TAG, "parseResponseToUser: projectId = " + projectId);
+ } else if (response.code() == HTTP_BAD_REQUEST) {
+ Log.e(TAG, "The request body is invalid.");
+ throw new CustomException.BadRequestException();
+ } else if (response.code() == HTTP_UNAUTHORIZED) {
+ Log.e(TAG, "The username or password is wrong.");
+ throw new CustomException.LogInInfoErrorException();
+ } else if (response.code() == HTTP_FORBIDDEN) {
+ Log.e(TAG, "No permission to get token.");
+ throw new CustomException.ForbiddenException();
+ } else if (response.code() == HTTP_NOT_FOUND) {
+ Log.e(TAG, "No resource found.");
+ throw new CustomException.ResourceNotFoundException();
+ } else if (response.code() == HTTP_INTERNAL_ERROR) {
+ Log.e(TAG, "Server internal error.");
+ throw new CustomException.ServerError();
+ } else if (response.code() == HTTP_UNAVAILABLE) {
+ Log.e(TAG, "Service Unavailable.");
+ throw new CustomException.ServiceUnavailableException();
+ } else {
+ Log.e(TAG, "Failed to login, code = " + response.code() + ". ");
+ throw new CustomException.FailedToLogInException();
+ }
+
+ mUser.getUserToken().put(mRegion, tokenStr);
+ mUser.getUserTokenExpireTime().put(mRegion, tokenExpireTimeStr);
+ mUser.getUserProjectId().put(mRegion, projectId);
+ return new ArrayList<>(Collections.singletonList(mUser));
+ }
+
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..d80c021cb8f49070980e02ad0a705be1dfead290
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/management/ConnectInfoModel.java
@@ -0,0 +1,175 @@
+package com.huawei.cloudapp.model.management;
+
+import static com.huawei.cloudapp.utils.CasCommonUtils.getManagementUrl;
+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.CONNECTION;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.ERROR_CODE;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.ERROR_MSG;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.IP;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.IP_PATTERN;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PHONE_ID;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PORT;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.POSITIVE_NUMBER_PATTERN;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.SESSION_ID;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.TOKEN;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.TOUCH_TIMEOUT;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.google.gson.Gson;
+import com.huawei.cloudapp.common.CASLog;
+import com.huawei.cloudapp.model.IConnectInfoModel;
+import com.huawei.cloudapp.model.OnRequestListener;
+import com.huawei.cloudapp.model.bean.CustomException;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.management.CasConnectInfo;
+import com.huawei.cloudapp.utils.CasCommonUtils;
+import com.huawei.cloudapp.utils.CasHttpUtils;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+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");
+ Gson gson = new Gson();
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(TOKEN, user.getUserTokenByRegion(region));
+ requestHeader.put(SESSION_ID, user.getUserSessionId());
+ CasHttpUtils.post(url, requestHeader, gson.toJson(requestBody), new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+ try {
+ onRequestListener.onSuccess(parseResponseToConnectInfo(response), 1);
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public List parseResponseToConnectInfo(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+
+ String rspStr = response.body().string();
+ if (rspStr.isEmpty()) {
+ Log.e(TAG, "Failed to get start param response.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ Map rspMap = CasCommonUtils.parseJsonMessage(rspStr);
+ if (rspMap.isEmpty()) {
+ Log.e(TAG, "Failed to get start param response, rspMap is empty.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+ if (rspMap.containsKey(ERROR_CODE)) {
+ if (rspMap.get(ERROR_CODE).equals("CPH.MANAGER.USER.00003")) {
+ Log.e(TAG, "The session is invalid, need to log in again.");
+ throw new CustomException.LogInInfoInvalidException();
+ } else {
+ Log.e(TAG, "Failed to get start param response. " + rspMap.get(ERROR_CODE) + ": " + rspMap.get(ERROR_MSG));
+ throw new CustomException.FailedToGetConnectInfoException(rspMap.get(ERROR_CODE) + ": " + rspMap.get(ERROR_MSG));
+ }
+ }
+
+ if (!rspMap.containsKey(IP) || !rspMap.containsKey(PORT) || !rspMap.containsKey(SESSION_ID)) {
+ Log.e(TAG, "The start param is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ String ip = (String) rspMap.get(IP);
+ if (ip == null || !IP_PATTERN.matcher(ip).matches()) {
+ CASLog.e(TAG, "Parameter: ip is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ String port = String.valueOf(((Double) rspMap.get(PORT)).intValue());
+ if (port.isEmpty() || !POSITIVE_NUMBER_PATTERN.matcher(port).matches()) {
+ CASLog.e(TAG, "Parameter: port is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ String sessionId = (String) rspMap.get(SESSION_ID);
+ if (sessionId == null) {
+ CASLog.e(TAG, "Parameter: session_id is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ String backgroundTimeout = String.valueOf(((Double) rspMap.get(BACKGROUND_TIMEOUT)).intValue());
+ if (backgroundTimeout.isEmpty()) {
+ CASLog.e(TAG, "Parameter: backgroundTimeout is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ String availablePlaytime = String.valueOf(((Double) rspMap.get(AVAILABLE_PLAYTIME)).intValue());
+ if (availablePlaytime.isEmpty()) {
+ CASLog.e(TAG, "Parameter: available_playtime is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ String touchTimeout = String.valueOf(((Double) rspMap.get(TOUCH_TIMEOUT)).intValue());
+ if (touchTimeout.isEmpty()) {
+ CASLog.e(TAG, "Parameter: touch_timeout is invalid.");
+ throw new CustomException.ResponseParamsException();
+ }
+
+ CasConnectInfo mConnectInfo = GenerateConnectInfo(ip, port, sessionId, backgroundTimeout, availablePlaytime, touchTimeout);
+ return Collections.singletonList(mConnectInfo);
+ }
+
+ public CasConnectInfo GenerateConnectInfo(String ip,
+ String port,
+ String sessionId,
+ String backgroundTimeout,
+ String availablePlayTime,
+ String touchTimeout) {
+ if (ip.isEmpty() || port.isEmpty()) {
+ return null;
+ }
+ if (sessionId.isEmpty()) {
+ sessionId = UUID.randomUUID().toString().replaceAll("-", "");
+ }
+ CasConnectInfo connectorInfo = new CasConnectInfo();
+ connectorInfo.setConnectIp(ip);
+ connectorInfo.setConnectPort(port);
+ connectorInfo.setBackgroundTimeout(backgroundTimeout.isEmpty() ? "60" : backgroundTimeout);
+ connectorInfo.setAvailablePlayTime(availablePlayTime.isEmpty() ? "0" : availablePlayTime);
+ connectorInfo.setSessionId(sessionId);
+ connectorInfo.setTicket("ticket_xxxxxx");
+ connectorInfo.setAesKey("11111111111111111111111111111111");
+ connectorInfo.setAesKey(mPhoneId);
+ connectorInfo.setAuthTs("987654321");
+ connectorInfo.setTouchTimeout(touchTimeout.isEmpty() ? "0" : touchTimeout);
+ return connectorInfo;
+ }
+}
diff --git a/app/src/main/java/com/huawei/cloudapp/model/management/PhoneModel.java b/app/src/main/java/com/huawei/cloudapp/model/management/PhoneModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..8812f69fe0cbcaec37ebdf0bbb9c8678e7b1c791
--- /dev/null
+++ b/app/src/main/java/com/huawei/cloudapp/model/management/PhoneModel.java
@@ -0,0 +1,129 @@
+package com.huawei.cloudapp.model.management;
+
+import static com.huawei.cloudapp.utils.CasCommonUtils.getManagementUrl;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.ERROR_CODE;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.LIST;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PHONE;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PHONE_ID;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.PHONE_NAME;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.REGION_ID;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.SESSION_ID;
+import static com.huawei.cloudapp.utils.CasConstantsUtil.TOKEN;
+
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import com.huawei.cloudapp.model.IPhoneModel;
+import com.huawei.cloudapp.model.OnRequestListener;
+import com.huawei.cloudapp.model.bean.CustomException;
+import com.huawei.cloudapp.model.bean.PhoneInfo;
+import com.huawei.cloudapp.model.bean.User;
+import com.huawei.cloudapp.model.bean.direct.PhoneDetail;
+import com.huawei.cloudapp.model.bean.direct.PhoneJobResponse;
+import com.huawei.cloudapp.utils.CasCommonUtils;
+import com.huawei.cloudapp.utils.CasConstantsUtil;
+import com.huawei.cloudapp.utils.CasHttpUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Response;
+
+public class PhoneModel implements IPhoneModel {
+ private static final String TAG = "PhoneModel";
+
+ @Override
+ public void getPhoneList(User user, HashMap condition, String region, String projectId, int offset, int limit, OnRequestListener onRequestListener) {
+ String url = getManagementUrl() + "/" + PHONE + "/" + LIST;
+ HashMap requestHeader = new HashMap();
+ requestHeader.put(TOKEN, user.getUserTokenByRegion(region));
+ requestHeader.put(SESSION_ID, user.getUserSessionId());
+ CasHttpUtils.post(url, requestHeader, "", new Callback() {
+ @Override
+ public void onFailure(@NonNull Call call, @NonNull IOException e) {
+ onRequestListener.onFailure(e);
+ }
+ @Override
+ public void onResponse(@NonNull Call call, @NonNull Response response) {
+ try {
+ List phoneInfos = parseResponseToPhoneList(response);
+ onRequestListener.onSuccess(phoneInfos, phoneInfos.size());
+ } catch (Exception e) {
+ onRequestListener.onFailure(e);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void getPhoneDetailInfo(User user, String region, String projectId, String phoneId, OnRequestListener onRequestListener) {
+
+ }
+
+ @Override
+ public void resetPhone(User user,
+ String region,
+ String projectId,
+ List phoneIdList,
+ String imageId,
+ List> property,
+ OnRequestListener onRequestListener) {
+
+ }
+
+ @Override
+ public void restartPhone(User user,
+ String region,
+ String projectId,
+ List phoneIdList,
+ String imageId,
+ List> property,
+ OnRequestListener onRequestListener) {
+
+ }
+
+ public List parseResponseToPhoneList(Response response) throws Exception {
+ if (response == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+
+
+ String rspStr = response.body().string();
+ if (rspStr == null) {
+ Log.e(TAG, "Failed to get response from server.");
+ throw new CustomException.EmptyResponseFromServerException();
+ }
+
+ //处理结果
+ List