diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 7be114e..710fe14 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -24,17 +24,25 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.ImageFileViewModel +import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.rotateImage +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.ByteArrayOutputStream import java.io.IOException @@ -64,16 +72,42 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) + private val locationManager by lazy { LocationManager(this) } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis + private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel + private var inspectionId = "" private var isRecognizing = false private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + locationManager.getCurrentLocation(true, object : LocationManager.OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + val inspectionUser = SaveKeyValues.getValue( + LocaleConstant.ACCOUNT, "" + ) as String + + val currentTimeMillis = System.currentTimeMillis() + val inspectionDate = currentTimeMillis.timestampToDate() + val startTime = currentTimeMillis.timestampToTime() + inspectionViewModel.startInspection( + context, inspectionUser, address, inspectionDate, startTime + ) + } + } + }) + inspectionViewModel.addResultModel.observe(this) { + if (it.code == 200) { + inspectionId = it.data + } + } + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { @@ -192,9 +226,15 @@ val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) val base64 = bitmap.rotateImage(90).encodeToBase64() - imageFileViewModel.getRecognizeResult( - context, base64, binding.titleView.getTitle() - ) + if (inspectionId.isNotBlank()) { +// imageFileViewModel.getRecognizeResult( +// context, base64, binding.titleView.getTitle(), inspectionId +// ) + } else { + runOnUiThread { + "巡检ID异常,请重新建立巡检任务".show(context) + } + } } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 @@ -221,7 +261,11 @@ override fun initEvent() { binding.stopButton.setOnClickListener { - navigatePageTo() + if (inspectionId.isBlank()) { + "巡检任务创建中,请稍后再结束任务".show(this) + return@setOnClickListener + } + navigatePageTo(inspectionId) } binding.tipsButton.setOnClickListener { @@ -259,14 +303,15 @@ }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - } - }) + private val selectSceneLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult(), + ActivityResultCallback { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data ?: return@ActivityResultCallback + val sceneName = data.getStringExtra("sceneName").toString() + binding.titleView.setTitle(sceneName) + } + }) private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) @@ -274,4 +319,9 @@ AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } + + override fun onDestroy() { + super.onDestroy() + locationManager.stopLocation() + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 7be114e..710fe14 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -24,17 +24,25 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.ImageFileViewModel +import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.rotateImage +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.ByteArrayOutputStream import java.io.IOException @@ -64,16 +72,42 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) + private val locationManager by lazy { LocationManager(this) } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis + private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel + private var inspectionId = "" private var isRecognizing = false private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + locationManager.getCurrentLocation(true, object : LocationManager.OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + val inspectionUser = SaveKeyValues.getValue( + LocaleConstant.ACCOUNT, "" + ) as String + + val currentTimeMillis = System.currentTimeMillis() + val inspectionDate = currentTimeMillis.timestampToDate() + val startTime = currentTimeMillis.timestampToTime() + inspectionViewModel.startInspection( + context, inspectionUser, address, inspectionDate, startTime + ) + } + } + }) + inspectionViewModel.addResultModel.observe(this) { + if (it.code == 200) { + inspectionId = it.data + } + } + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { @@ -192,9 +226,15 @@ val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) val base64 = bitmap.rotateImage(90).encodeToBase64() - imageFileViewModel.getRecognizeResult( - context, base64, binding.titleView.getTitle() - ) + if (inspectionId.isNotBlank()) { +// imageFileViewModel.getRecognizeResult( +// context, base64, binding.titleView.getTitle(), inspectionId +// ) + } else { + runOnUiThread { + "巡检ID异常,请重新建立巡检任务".show(context) + } + } } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 @@ -221,7 +261,11 @@ override fun initEvent() { binding.stopButton.setOnClickListener { - navigatePageTo() + if (inspectionId.isBlank()) { + "巡检任务创建中,请稍后再结束任务".show(this) + return@setOnClickListener + } + navigatePageTo(inspectionId) } binding.tipsButton.setOnClickListener { @@ -259,14 +303,15 @@ }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - } - }) + private val selectSceneLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult(), + ActivityResultCallback { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data ?: return@ActivityResultCallback + val sceneName = data.getStringExtra("sceneName").toString() + binding.titleView.setTitle(sceneName) + } + }) private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) @@ -274,4 +319,9 @@ AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } + + override fun onDestroy() { + super.onDestroy() + locationManager.stopLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt index dd2dedd..6508312 100644 --- a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.extensions.getResponseMessage -import com.casic.br.app.model.AddHiddenTroubleModel +import com.casic.br.app.model.AddHiddenTroubleResultModel import com.casic.br.app.model.HiddenTroubleDetailModel import com.casic.br.app.model.HiddenTroubleModel import com.casic.br.app.retrofit.RetrofitServiceManager @@ -18,7 +18,7 @@ class HiddenTroubleViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val addTroubleResult = MutableLiveData() + val addTroubleResult = MutableLiveData() val troublesResult = MutableLiveData() val troubleDetailResult = MutableLiveData() @@ -41,8 +41,8 @@ when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success - addTroubleResult.value = gson.fromJson( - response, object : TypeToken() {}.type + addTroubleResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) } diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 7be114e..710fe14 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -24,17 +24,25 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.ImageFileViewModel +import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.rotateImage +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.ByteArrayOutputStream import java.io.IOException @@ -64,16 +72,42 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) + private val locationManager by lazy { LocationManager(this) } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis + private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel + private var inspectionId = "" private var isRecognizing = false private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + locationManager.getCurrentLocation(true, object : LocationManager.OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + val inspectionUser = SaveKeyValues.getValue( + LocaleConstant.ACCOUNT, "" + ) as String + + val currentTimeMillis = System.currentTimeMillis() + val inspectionDate = currentTimeMillis.timestampToDate() + val startTime = currentTimeMillis.timestampToTime() + inspectionViewModel.startInspection( + context, inspectionUser, address, inspectionDate, startTime + ) + } + } + }) + inspectionViewModel.addResultModel.observe(this) { + if (it.code == 200) { + inspectionId = it.data + } + } + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { @@ -192,9 +226,15 @@ val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) val base64 = bitmap.rotateImage(90).encodeToBase64() - imageFileViewModel.getRecognizeResult( - context, base64, binding.titleView.getTitle() - ) + if (inspectionId.isNotBlank()) { +// imageFileViewModel.getRecognizeResult( +// context, base64, binding.titleView.getTitle(), inspectionId +// ) + } else { + runOnUiThread { + "巡检ID异常,请重新建立巡检任务".show(context) + } + } } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 @@ -221,7 +261,11 @@ override fun initEvent() { binding.stopButton.setOnClickListener { - navigatePageTo() + if (inspectionId.isBlank()) { + "巡检任务创建中,请稍后再结束任务".show(this) + return@setOnClickListener + } + navigatePageTo(inspectionId) } binding.tipsButton.setOnClickListener { @@ -259,14 +303,15 @@ }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - } - }) + private val selectSceneLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult(), + ActivityResultCallback { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data ?: return@ActivityResultCallback + val sceneName = data.getStringExtra("sceneName").toString() + binding.titleView.setTitle(sceneName) + } + }) private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) @@ -274,4 +319,9 @@ AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } + + override fun onDestroy() { + super.onDestroy() + locationManager.stopLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt index dd2dedd..6508312 100644 --- a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.extensions.getResponseMessage -import com.casic.br.app.model.AddHiddenTroubleModel +import com.casic.br.app.model.AddHiddenTroubleResultModel import com.casic.br.app.model.HiddenTroubleDetailModel import com.casic.br.app.model.HiddenTroubleModel import com.casic.br.app.retrofit.RetrofitServiceManager @@ -18,7 +18,7 @@ class HiddenTroubleViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val addTroubleResult = MutableLiveData() + val addTroubleResult = MutableLiveData() val troublesResult = MutableLiveData() val troubleDetailResult = MutableLiveData() @@ -41,8 +41,8 @@ when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success - addTroubleResult.value = gson.fromJson( - response, object : TypeToken() {}.type + addTroubleResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) } diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index e6a5ed6..8821e65 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -21,27 +21,28 @@ val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getRecognizeResult(context: Context, base64: String, scene: String) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } + fun getRecognizeResult(context: Context, base64: String, scene: String, xujian_id: String) = + launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getRecognizeResult(base64, scene, xujian_id) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + recognizeResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail + else -> { + val element = JsonParser.parseString(response) + val jsonObject = element.asJsonObject + jsonObject.get("result").asString.show(context) + loadState.value = LoadState.Fail + } } - } - }, { - loadState.value = LoadState.Fail - }) + }, { + loadState.value = LoadState.Fail + }) fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 7be114e..710fe14 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -24,17 +24,25 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.ImageFileViewModel +import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.rotateImage +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.ByteArrayOutputStream import java.io.IOException @@ -64,16 +72,42 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) + private val locationManager by lazy { LocationManager(this) } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis + private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel + private var inspectionId = "" private var isRecognizing = false private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + locationManager.getCurrentLocation(true, object : LocationManager.OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + val inspectionUser = SaveKeyValues.getValue( + LocaleConstant.ACCOUNT, "" + ) as String + + val currentTimeMillis = System.currentTimeMillis() + val inspectionDate = currentTimeMillis.timestampToDate() + val startTime = currentTimeMillis.timestampToTime() + inspectionViewModel.startInspection( + context, inspectionUser, address, inspectionDate, startTime + ) + } + } + }) + inspectionViewModel.addResultModel.observe(this) { + if (it.code == 200) { + inspectionId = it.data + } + } + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { @@ -192,9 +226,15 @@ val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) val base64 = bitmap.rotateImage(90).encodeToBase64() - imageFileViewModel.getRecognizeResult( - context, base64, binding.titleView.getTitle() - ) + if (inspectionId.isNotBlank()) { +// imageFileViewModel.getRecognizeResult( +// context, base64, binding.titleView.getTitle(), inspectionId +// ) + } else { + runOnUiThread { + "巡检ID异常,请重新建立巡检任务".show(context) + } + } } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 @@ -221,7 +261,11 @@ override fun initEvent() { binding.stopButton.setOnClickListener { - navigatePageTo() + if (inspectionId.isBlank()) { + "巡检任务创建中,请稍后再结束任务".show(this) + return@setOnClickListener + } + navigatePageTo(inspectionId) } binding.tipsButton.setOnClickListener { @@ -259,14 +303,15 @@ }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - } - }) + private val selectSceneLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult(), + ActivityResultCallback { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data ?: return@ActivityResultCallback + val sceneName = data.getStringExtra("sceneName").toString() + binding.titleView.setTitle(sceneName) + } + }) private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) @@ -274,4 +319,9 @@ AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } + + override fun onDestroy() { + super.onDestroy() + locationManager.stopLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt index dd2dedd..6508312 100644 --- a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.extensions.getResponseMessage -import com.casic.br.app.model.AddHiddenTroubleModel +import com.casic.br.app.model.AddHiddenTroubleResultModel import com.casic.br.app.model.HiddenTroubleDetailModel import com.casic.br.app.model.HiddenTroubleModel import com.casic.br.app.retrofit.RetrofitServiceManager @@ -18,7 +18,7 @@ class HiddenTroubleViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val addTroubleResult = MutableLiveData() + val addTroubleResult = MutableLiveData() val troublesResult = MutableLiveData() val troubleDetailResult = MutableLiveData() @@ -41,8 +41,8 @@ when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success - addTroubleResult.value = gson.fromJson( - response, object : TypeToken() {}.type + addTroubleResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) } diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index e6a5ed6..8821e65 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -21,27 +21,28 @@ val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getRecognizeResult(context: Context, base64: String, scene: String) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } + fun getRecognizeResult(context: Context, base64: String, scene: String, xujian_id: String) = + launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getRecognizeResult(base64, scene, xujian_id) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + recognizeResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail + else -> { + val element = JsonParser.parseString(response) + val jsonObject = element.asJsonObject + jsonObject.get("result").asString.show(context) + loadState.value = LoadState.Fail + } } - } - }, { - loadState.value = LoadState.Fail - }) + }, { + loadState.value = LoadState.Fail + }) fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading diff --git a/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt b/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt new file mode 100644 index 0000000..8be3433 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt @@ -0,0 +1,60 @@ +package com.casic.br.app.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.model.AddInspectionResultModel +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState + +/** + * 巡检VM + * */ +class InspectionViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val addResultModel = MutableLiveData() + + fun startInspection( + context: Context, + inspectionUser: String, + inspectionAddress: String, + inspectionDate: String, + startTime: String + ) = launch({ + val response = RetrofitServiceManager.addRecord( + inspectionUser, inspectionAddress, inspectionDate, startTime + ) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + addResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) + + fun stopInspection(context: Context, inspectionId: String, endTime: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.stopInspection(inspectionId, endTime) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + }, { + loadState.value = LoadState.Fail + it.localizedMessage?.show(context) + }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 7be114e..710fe14 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -24,17 +24,25 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.ImageFileViewModel +import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.rotateImage +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.ByteArrayOutputStream import java.io.IOException @@ -64,16 +72,42 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) + private val locationManager by lazy { LocationManager(this) } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis + private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel + private var inspectionId = "" private var isRecognizing = false private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + locationManager.getCurrentLocation(true, object : LocationManager.OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + val inspectionUser = SaveKeyValues.getValue( + LocaleConstant.ACCOUNT, "" + ) as String + + val currentTimeMillis = System.currentTimeMillis() + val inspectionDate = currentTimeMillis.timestampToDate() + val startTime = currentTimeMillis.timestampToTime() + inspectionViewModel.startInspection( + context, inspectionUser, address, inspectionDate, startTime + ) + } + } + }) + inspectionViewModel.addResultModel.observe(this) { + if (it.code == 200) { + inspectionId = it.data + } + } + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { @@ -192,9 +226,15 @@ val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) val base64 = bitmap.rotateImage(90).encodeToBase64() - imageFileViewModel.getRecognizeResult( - context, base64, binding.titleView.getTitle() - ) + if (inspectionId.isNotBlank()) { +// imageFileViewModel.getRecognizeResult( +// context, base64, binding.titleView.getTitle(), inspectionId +// ) + } else { + runOnUiThread { + "巡检ID异常,请重新建立巡检任务".show(context) + } + } } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 @@ -221,7 +261,11 @@ override fun initEvent() { binding.stopButton.setOnClickListener { - navigatePageTo() + if (inspectionId.isBlank()) { + "巡检任务创建中,请稍后再结束任务".show(this) + return@setOnClickListener + } + navigatePageTo(inspectionId) } binding.tipsButton.setOnClickListener { @@ -259,14 +303,15 @@ }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - } - }) + private val selectSceneLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult(), + ActivityResultCallback { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data ?: return@ActivityResultCallback + val sceneName = data.getStringExtra("sceneName").toString() + binding.titleView.setTitle(sceneName) + } + }) private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) @@ -274,4 +319,9 @@ AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } + + override fun onDestroy() { + super.onDestroy() + locationManager.stopLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt index dd2dedd..6508312 100644 --- a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.extensions.getResponseMessage -import com.casic.br.app.model.AddHiddenTroubleModel +import com.casic.br.app.model.AddHiddenTroubleResultModel import com.casic.br.app.model.HiddenTroubleDetailModel import com.casic.br.app.model.HiddenTroubleModel import com.casic.br.app.retrofit.RetrofitServiceManager @@ -18,7 +18,7 @@ class HiddenTroubleViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val addTroubleResult = MutableLiveData() + val addTroubleResult = MutableLiveData() val troublesResult = MutableLiveData() val troubleDetailResult = MutableLiveData() @@ -41,8 +41,8 @@ when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success - addTroubleResult.value = gson.fromJson( - response, object : TypeToken() {}.type + addTroubleResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) } diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index e6a5ed6..8821e65 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -21,27 +21,28 @@ val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getRecognizeResult(context: Context, base64: String, scene: String) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } + fun getRecognizeResult(context: Context, base64: String, scene: String, xujian_id: String) = + launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getRecognizeResult(base64, scene, xujian_id) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + recognizeResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail + else -> { + val element = JsonParser.parseString(response) + val jsonObject = element.asJsonObject + jsonObject.get("result").asString.show(context) + loadState.value = LoadState.Fail + } } - } - }, { - loadState.value = LoadState.Fail - }) + }, { + loadState.value = LoadState.Fail + }) fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading diff --git a/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt b/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt new file mode 100644 index 0000000..8be3433 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt @@ -0,0 +1,60 @@ +package com.casic.br.app.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.model.AddInspectionResultModel +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState + +/** + * 巡检VM + * */ +class InspectionViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val addResultModel = MutableLiveData() + + fun startInspection( + context: Context, + inspectionUser: String, + inspectionAddress: String, + inspectionDate: String, + startTime: String + ) = launch({ + val response = RetrofitServiceManager.addRecord( + inspectionUser, inspectionAddress, inspectionDate, startTime + ) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + addResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) + + fun stopInspection(context: Context, inspectionId: String, endTime: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.stopInspection(inspectionId, endTime) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + }, { + loadState.value = LoadState.Fail + it.localizedMessage?.show(context) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/widgets/CheckResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/CheckResultDialog.kt deleted file mode 100644 index 43e5881..0000000 --- a/app/src/main/java/com/casic/br/app/widgets/CheckResultDialog.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.br.app.widgets - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import com.casic.br.app.databinding.DialogCheckResultBinding -import com.pengxh.kt.lite.extensions.binding -import com.pengxh.kt.lite.extensions.initDialogLayoutParams - -class CheckResultDialog constructor(context: Context) : Dialog(context) { - - private val binding: DialogCheckResultBinding by binding() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - this.initDialogLayoutParams(1f) - setCanceledOnTouchOutside(false) - - binding.dialogConfirmButton.setOnClickListener { - dismiss() - } - - binding.dialogCancelButton.setOnClickListener { dismiss() } - } -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7eb76a3..4809425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,4 +104,6 @@ implementation 'io.github.lucksiege:pictureselector:v3.11.1' //图片压缩 implementation 'top.zibin:Luban:1.1.8' + //高德导航、定位、地图三合一 + implementation 'com.amap.api:navi-3dmap:latest.integration' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 922f1f1..2a1bb1d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,20 +24,22 @@ android:name="android.permission.READ_MEDIA_VIDEO" android:minSdkVersion="33" /> - - - - - + + + + + + - + + + + + + + + + diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java deleted file mode 100644 index b6acdd9..0000000 --- a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.casic.br.app.model; - -public class AddHiddenTroubleModel { - - private int code; - private String data; - private String message; - private boolean success; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getData() { - return data; - } - - public void setData(String data) { - this.data = data; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public boolean isSuccess() { - return success; - } - - public void setSuccess(boolean success) { - this.success = success; - } -} diff --git a/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java new file mode 100644 index 0000000..86c8add --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddHiddenTroubleResultModel.java @@ -0,0 +1,41 @@ +package com.casic.br.app.model; + +public class AddHiddenTroubleResultModel { + + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java new file mode 100644 index 0000000..2fd38c5 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/model/AddInspectionResultModel.java @@ -0,0 +1,40 @@ +package com.casic.br.app.model; + +public class AddInspectionResultModel { + private int code; + private String data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index cf194ff..5e7055c 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -64,6 +64,24 @@ ): String /** + * 新建巡检 + */ + @POST("/inspection-record/addRecord") + suspend fun addRecord( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** + * 结束巡检 + */ + @POST("/inspection-record/updateRecord") + suspend fun stopInspection( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String + + /** * 添加隐患 */ @POST("/inspection-record/addAlarm") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index 0856595..b740e6a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -89,6 +89,38 @@ } /** + * 新建巡检 + */ + suspend fun addRecord( + inspectionUser: String, inspectionAddress: String, inspectionDate: String, startTime: String + ): String { + val param = JsonObject() + param.addProperty("inspectionUser", inspectionUser) + param.addProperty("inspectionAddress", inspectionAddress) + param.addProperty("inspectionDate", inspectionDate) + param.addProperty("startTime", startTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addRecord(AuthenticationHelper.token, requestBody) + } + + /** + * 结束巡检 + */ + suspend fun stopInspection(inspectionId: String, endTime: String): String { + val param = JsonObject() + param.addProperty("id", inspectionId) + param.addProperty("endTime", endTime) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.stopInspection(AuthenticationHelper.token, requestBody) + } + + /** * 添加隐患 */ suspend fun addHiddenTrouble( @@ -161,10 +193,11 @@ /** * 获取画面识别结果 * */ - suspend fun getRecognizeResult(base64: String, scene: String): String { + suspend fun getRecognizeResult(base64: String, scene: String, xujian_id: String): String { val map: MutableMap = mutableMapOf() map["img"] = "data:image/png;base64,${base64}".toRequestBody() map["scene"] = scene.toRequestBody() + map["xujian_id"] = xujian_id.toRequestBody() return aiApi.getRecognizeResult(map) } diff --git a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt index b5b58d9..3b49732 100644 --- a/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/app/utils/LocaleConstant.kt @@ -57,5 +57,5 @@ const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val SERVER_BASE_URL = "http://111.198.10.15:22003" const val AI_SERVER_CONFIG = "aiServerConfig" - const val AI_BASE_URL = "http://192.168.206.248:5000" + const val AI_BASE_URL = "http://192.168.186.127:5000" } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/utils/LocationManager.kt b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt new file mode 100644 index 0000000..99762ec --- /dev/null +++ b/app/src/main/java/com/casic/br/app/utils/LocationManager.kt @@ -0,0 +1,41 @@ +package com.casic.br.app.utils + +import android.content.Context +import android.util.Log +import com.amap.api.location.AMapLocation +import com.amap.api.location.AMapLocationClient +import com.amap.api.location.AMapLocationClientOption + +class LocationManager constructor(context: Context) { + + private val kTag = "LocationManager" + private val locationClient by lazy { AMapLocationClient(context) } + + fun getCurrentLocation(isOnceLocation: Boolean, listener: OnGetLocationListener) { + val locationOption = AMapLocationClientOption() + locationOption.locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy + locationOption.isOnceLocation = isOnceLocation + locationOption.isNeedAddress = true + locationClient.setLocationOption(locationOption) + locationClient.setLocationListener { + if (it.errorCode == 0) { + listener.onAMapLocationGet(it) + } else { + listener.onAMapLocationGet(null) + Log.e(kTag, "errCode:${it.errorCode}, errInfo:${it.errorInfo}") + } + } + locationClient.startLocation() + } + + fun stopLocation() { + locationClient.stopLocation() + } + + /** + * 经纬度定位回调 + * */ + interface OnGetLocationListener { + fun onAMapLocationGet(location: AMapLocation?) //高德定位数据 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index eb04120..3238eef 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -177,6 +177,7 @@ override fun onItemLongClick(view: View?, position: Int) { selectedImages.removeAt(position) + imagePaths.removeAt(position) recyclerViewImages.removeAt(position) imageAdapter.notifyDataSetChanged() } diff --git a/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt new file mode 100644 index 0000000..8574b52 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/view/CheckResultActivity.kt @@ -0,0 +1,56 @@ +package com.casic.br.app.view + +import android.os.Bundle +import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.databinding.ActivityCheckResultBinding +import com.casic.br.app.vm.InspectionViewModel +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.LoadState + +class CheckResultActivity : KotlinBaseActivity() { + + private val kTag = "CheckResultActivity" + private val context = this + private lateinit var inspectionViewModel: InspectionViewModel + private lateinit var inspectionId: String + + override fun initEvent() { + binding.confirmButton.setOnClickListener { + inspectionViewModel.stopInspection( + this, inspectionId, System.currentTimeMillis().timestampToCompleteDate() + ) + } + + binding.cancelButton.setOnClickListener { finish() } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionId = intent.getStringExtra(Constant.INTENT_PARAM) as String + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + } + + override fun initViewBinding(): ActivityCheckResultBinding { + return ActivityCheckResultBinding.inflate(layoutInflater) + } + + override fun observeRequestState() { + inspectionViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> {} + LoadState.Success -> { + "结束巡检成功".show(this) + finish() + } + + LoadState.Fail -> "结束巡检失败,请重试".show(this) + } + } + } + + override fun setupTopBarLayout() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt index 1b01993..971d3a9 100644 --- a/app/src/main/java/com/casic/br/app/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/LoginActivity.kt @@ -2,6 +2,7 @@ import android.os.Bundle import androidx.lifecycle.ViewModelProvider +import com.amap.api.maps.MapsInitializer import com.casic.br.app.R import com.casic.br.app.databinding.ActivityLoginBinding import com.casic.br.app.utils.AuthenticationHelper @@ -114,7 +115,9 @@ } override fun onPermissionsGranted(requestCode: Int, perms: MutableList) { - + //先把定位隐私政策声明,后面会用到 + MapsInitializer.updatePrivacyShow(this, true, true) + MapsInitializer.updatePrivacyAgree(this, true) } override fun onPermissionsDenied(requestCode: Int, perms: MutableList) { diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 7be114e..710fe14 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -24,17 +24,25 @@ import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProvider +import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.model.DictionaryModel +import com.casic.br.app.utils.LocaleConstant +import com.casic.br.app.utils.LocationManager import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.ImageFileViewModel +import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.rotateImage +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToDate +import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.ByteArrayOutputStream import java.io.IOException @@ -64,16 +72,42 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) + private val locationManager by lazy { LocationManager(this) } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis + private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel private lateinit var imageFileViewModel: ImageFileViewModel + private var inspectionId = "" private var isRecognizing = false private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { + inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] + locationManager.getCurrentLocation(true, object : LocationManager.OnGetLocationListener { + override fun onAMapLocationGet(location: AMapLocation?) { + location?.apply { + val inspectionUser = SaveKeyValues.getValue( + LocaleConstant.ACCOUNT, "" + ) as String + + val currentTimeMillis = System.currentTimeMillis() + val inspectionDate = currentTimeMillis.timestampToDate() + val startTime = currentTimeMillis.timestampToTime() + inspectionViewModel.startInspection( + context, inspectionUser, address, inspectionDate, startTime + ) + } + } + }) + inspectionViewModel.addResultModel.observe(this) { + if (it.code == 200) { + inspectionId = it.data + } + } + configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] configViewModel.getDictionaryByCode(context, "pitfallBigType") configViewModel.dictionary.observe(this) { @@ -192,9 +226,15 @@ val bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size) val base64 = bitmap.rotateImage(90).encodeToBase64() - imageFileViewModel.getRecognizeResult( - context, base64, binding.titleView.getTitle() - ) + if (inspectionId.isNotBlank()) { +// imageFileViewModel.getRecognizeResult( +// context, base64, binding.titleView.getTitle(), inspectionId +// ) + } else { + runOnUiThread { + "巡检ID异常,请重新建立巡检任务".show(context) + } + } } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 @@ -221,7 +261,11 @@ override fun initEvent() { binding.stopButton.setOnClickListener { - navigatePageTo() + if (inspectionId.isBlank()) { + "巡检任务创建中,请稍后再结束任务".show(this) + return@setOnClickListener + } + navigatePageTo(inspectionId) } binding.tipsButton.setOnClickListener { @@ -259,14 +303,15 @@ }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - } - }) + private val selectSceneLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult(), + ActivityResultCallback { + if (it.resultCode == Activity.RESULT_OK) { + val data = it.data ?: return@ActivityResultCallback + val sceneName = data.getStringExtra("sceneName").toString() + binding.titleView.setTitle(sceneName) + } + }) private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) @@ -274,4 +319,9 @@ AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } + + override fun onDestroy() { + super.onDestroy() + locationManager.stopLocation() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt index dd2dedd..6508312 100644 --- a/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/HiddenTroubleViewModel.kt @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.extensions.getResponseMessage -import com.casic.br.app.model.AddHiddenTroubleModel +import com.casic.br.app.model.AddHiddenTroubleResultModel import com.casic.br.app.model.HiddenTroubleDetailModel import com.casic.br.app.model.HiddenTroubleModel import com.casic.br.app.retrofit.RetrofitServiceManager @@ -18,7 +18,7 @@ class HiddenTroubleViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val addTroubleResult = MutableLiveData() + val addTroubleResult = MutableLiveData() val troublesResult = MutableLiveData() val troubleDetailResult = MutableLiveData() @@ -41,8 +41,8 @@ when (response.getResponseCode()) { 200 -> { loadState.value = LoadState.Success - addTroubleResult.value = gson.fromJson( - response, object : TypeToken() {}.type + addTroubleResult.value = gson.fromJson( + response, object : TypeToken() {}.type ) } diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index e6a5ed6..8821e65 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -21,27 +21,28 @@ val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getRecognizeResult(context: Context, base64: String, scene: String) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } + fun getRecognizeResult(context: Context, base64: String, scene: String, xujian_id: String) = + launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getRecognizeResult(base64, scene, xujian_id) + when (response.getResponseCode()) { + 200 -> { + loadState.value = LoadState.Success + recognizeResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail + else -> { + val element = JsonParser.parseString(response) + val jsonObject = element.asJsonObject + jsonObject.get("result").asString.show(context) + loadState.value = LoadState.Fail + } } - } - }, { - loadState.value = LoadState.Fail - }) + }, { + loadState.value = LoadState.Fail + }) fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading diff --git a/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt b/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt new file mode 100644 index 0000000..8be3433 --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/InspectionViewModel.kt @@ -0,0 +1,60 @@ +package com.casic.br.app.vm + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.model.AddInspectionResultModel +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.LoadState + +/** + * 巡检VM + * */ +class InspectionViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val addResultModel = MutableLiveData() + + fun startInspection( + context: Context, + inspectionUser: String, + inspectionAddress: String, + inspectionDate: String, + startTime: String + ) = launch({ + val response = RetrofitServiceManager.addRecord( + inspectionUser, inspectionAddress, inspectionDate, startTime + ) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + addResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) + + fun stopInspection(context: Context, inspectionId: String, endTime: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.stopInspection(inspectionId, endTime) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.getResponseMessage().show(context) + } + }, { + loadState.value = LoadState.Fail + it.localizedMessage?.show(context) + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/widgets/CheckResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/CheckResultDialog.kt deleted file mode 100644 index 43e5881..0000000 --- a/app/src/main/java/com/casic/br/app/widgets/CheckResultDialog.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.casic.br.app.widgets - -import android.app.Dialog -import android.content.Context -import android.os.Bundle -import com.casic.br.app.databinding.DialogCheckResultBinding -import com.pengxh.kt.lite.extensions.binding -import com.pengxh.kt.lite.extensions.initDialogLayoutParams - -class CheckResultDialog constructor(context: Context) : Dialog(context) { - - private val binding: DialogCheckResultBinding by binding() - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - this.initDialogLayoutParams(1f) - setCanceledOnTouchOutside(false) - - binding.dialogConfirmButton.setOnClickListener { - dismiss() - } - - binding.dialogCancelButton.setOnClickListener { dismiss() } - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_check_result.xml b/app/src/main/res/layout/activity_check_result.xml new file mode 100644 index 0000000..8b0dc1d --- /dev/null +++ b/app/src/main/res/layout/activity_check_result.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + +