diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml deleted file mode 100644 index 8cdcc8b..0000000 --- a/app/src/main/res/layout/activity_show_log.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml deleted file mode 100644 index 8cdcc8b..0000000 --- a/app/src/main/res/layout/activity_show_log.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_detail.xml b/app/src/main/res/layout/activity_user_detail.xml new file mode 100644 index 0000000..a2bb202 --- /dev/null +++ b/app/src/main/res/layout/activity_user_detail.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index aa2699f..7ec44c5 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,30 +3,47 @@ diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml deleted file mode 100644 index 8cdcc8b..0000000 --- a/app/src/main/res/layout/activity_show_log.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_detail.xml b/app/src/main/res/layout/activity_user_detail.xml new file mode 100644 index 0000000..a2bb202 --- /dev/null +++ b/app/src/main/res/layout/activity_user_detail.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_map_inspect.xml b/app/src/main/res/layout/fragment_map_inspect.xml index ae1171e..568e19e 100644 --- a/app/src/main/res/layout/fragment_map_inspect.xml +++ b/app/src/main/res/layout/fragment_map_inspect.xml @@ -6,7 +6,11 @@ android:background="@color/white" android:orientation="vertical"> - + + + diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml deleted file mode 100644 index 8cdcc8b..0000000 --- a/app/src/main/res/layout/activity_show_log.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_detail.xml b/app/src/main/res/layout/activity_user_detail.xml new file mode 100644 index 0000000..a2bb202 --- /dev/null +++ b/app/src/main/res/layout/activity_user_detail.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_map_inspect.xml b/app/src/main/res/layout/fragment_map_inspect.xml index ae1171e..568e19e 100644 --- a/app/src/main/res/layout/fragment_map_inspect.xml +++ b/app/src/main/res/layout/fragment_map_inspect.xml @@ -6,7 +6,11 @@ android:background="@color/white" android:orientation="vertical"> - + + +
- + diff --git a/app/build.gradle b/app/build.gradle index a2a60a3..0f9a4e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { signingConfigs { release { - storeFile file("${rootDir}/app/Inspection.jks") + storeFile file("/Users/a203/Desktop/AndroidProjects/MethaneInspection/app/Inspection.jks") storePassword '123456789' keyAlias 'appKey' keyPassword '123456789' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c5f8a9a..6f006bd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,7 @@ + @@ -32,7 +33,7 @@ android:name=".base.BaseApplication" android:allowBackup="true" android:allowNativeHeapPointerTagging="false" - android:icon="@mipmap/logo" + android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:supportsRtl="true" @@ -53,7 +54,8 @@ android:theme="@style/Theme.BigImageActivity" /> - + + diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..caf7c87 --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,20 @@ + + + + + + + + +

1、如何新建巡检?

+  登录APP进入系统,首页地图左边四个按钮第四个按钮即为新建巡检按钮,按照弹出对话框提示即可新建巡检任务,然后就可以手持巡检设备开始进行检测作业。
+

2、如何新建事件?

+  当巡检到异常之后,可以点击【新建事件】来记录此时此地的巡检数据,巡检结束后可以直接在【数据】页查看当时的异常数据或者在巡检系统看到原始数据。 +

3、如何连接设备?

+  首先确认手机蓝牙已打开,然后点击首页地图左边第二个按钮开始扫描附近可用的蓝牙设备,一段时间后点击扫描出来的需要连接的设备进行连接即可。 +

4、地图无法正常显示或报找不到许可文件错误怎么办?

+  手机版本原因可能部分手机默认不允许读取存储,需要进入系统设置,为应用开启读取存储的权限即可。 +

5、应用所需的其他权限?

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..65bf7b8 --- /dev/null +++ b/app/src/main/ic_launcher-playstore.png Binary files differ diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt new file mode 100644 index 0000000..acf996d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.birmm.inspect.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt index 409ca4e..103b958 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/DataLogPageFragment.kt @@ -1,12 +1,13 @@ package com.casic.birmm.inspect.fragment -import android.view.View +import android.graphics.Color +import android.widget.LinearLayout import androidx.fragment.app.Fragment import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_query_data_log.* -import kotlinx.android.synthetic.main.include_base_title.* class DataLogPageFragment : KotlinBaseFragment() { @@ -35,7 +36,11 @@ } override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "数据" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.setBackgroundColor(Color.WHITE) + statusBarView.requestLayout() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt index 9b91165..52579df 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/HomePageFragment.kt @@ -13,6 +13,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.AMap @@ -47,9 +48,9 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.fragment_map_inspect.view.* -import kotlinx.android.synthetic.main.include_base_title.view.* @SuppressLint("MissingPermission") class HomePageFragment : Fragment() { @@ -82,9 +83,12 @@ ): View { homeView = inflater.inflate(R.layout.fragment_map_inspect, container, false) - homeView.leftBackView.visibility = View.GONE - homeView.titleView.text = "巡检" - homeView.rightImageView.visibility = View.VISIBLE + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + homeView.statusBarView.requestLayout() vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator eventViewModel = ViewModelProvider(this)[EventViewModel::class.java] @@ -131,7 +135,7 @@ } private fun initEvent() { - homeView.rightImageView.setOnClickListener { + homeView.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃").setPositiveButton("开始巡检") .setOnDialogButtonClickListener(object : diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt index 0a249eb..91e66ad 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/QueryInspectionFragment.kt @@ -2,10 +2,14 @@ import android.os.Handler import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration import com.casic.birmm.inspect.R import com.casic.birmm.inspect.model.InspectListModel +import com.casic.birmm.inspect.model.RoutePointModel import com.casic.birmm.inspect.view.InspectionRouteActivity import com.casic.birmm.inspect.vm.InspectionViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment @@ -27,6 +31,7 @@ private lateinit var weakReferenceHandler: WeakReferenceHandler private lateinit var adapter: NormalRecyclerAdapter private lateinit var viewModel: InspectionViewModel + private val gson by lazy { Gson() } override fun initLayoutView(): Int = R.layout.fragment_query_inspect @@ -111,13 +116,27 @@ position: Int, item: InspectListModel.DataModel.RowsModel ) { - viewHolder.setImageResource(R.id.inspectImageView, R.mipmap.logo) + val routeJson = item.routes!! + val routeModels = if (routeJson.isEmpty()) { + ArrayList() + } else { + gson.fromJson>( + routeJson, + object : TypeToken>() {}.type + ) + } viewHolder.setText(R.id.inspectMsgView, item.name) - .setText(R.id.inspectUserView,"巡检人:${item.user}") - .setText(R.id.inspectDateView, "上报时间:${item.date}") + .setText(R.id.inspectUserView, "巡检人:${item.user}") + .setText( + R.id.inspectDateView, + "巡检时间:${item.startTime} ~ ${item.endTime}" + ).setText(R.id.inspectPointView, "巡检点数:${routeModels.size}个") } } + inspectRecyclerView.addItemDecoration( + DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) + ) inspectRecyclerView!!.adapter = adapter adapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt index 4148800..4078afe 100644 --- a/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/fragment/SettingPageFragment.kt @@ -1,49 +1,122 @@ package com.casic.birmm.inspect.fragment import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.net.Uri import android.os.Vibrator -import android.view.View +import android.widget.LinearLayout import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.callback.OnImageCompressListener +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.compressImage +import com.casic.birmm.inspect.extensions.reformat import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.LoadingDialogHub import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper +import com.casic.birmm.inspect.view.HelpCenterActivity import com.casic.birmm.inspect.view.LoginActivity -import com.casic.birmm.inspect.view.ShowLogActivity +import com.casic.birmm.inspect.view.UserDetailActivity +import com.casic.birmm.inspect.vm.UploadImageViewModel import com.casic.birmm.inspect.vm.UserViewModel -import com.google.gson.Gson +import com.casic.xz.meterage.utils.GlideLoadEngine +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet +import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_user_settings.* -import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class SettingPageFragment : KotlinBaseFragment() { - private val gson by lazy { Gson() } private lateinit var userViewModel: UserViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var vibrator: Vibrator + private lateinit var user: UserInfoModel.DataModel override fun initLayoutView(): Int = R.layout.fragment_user_settings override fun setupTopBarLayout() { - leftBackView.visibility = View.GONE - titleView.text = "设置" + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val params = statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + statusBarView.requestLayout() } override fun initData() { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + this.user = it.data - val userModelJson = SaveKeyValues.getValue(LocaleConstant.USER_OBJECT, "") as String - val userModel = gson.fromJson(userModelJson, UserInfoModel::class.java) - val data = userModel.data - userNameView.text = data?.name - userPhoneView.text = data?.phone + userNameView.text = user.name + userUnitView.text = user.deptName + userPhoneView.text = user.phone + + if (user.avatar.isNullOrBlank()) { + Glide.with(requireContext()) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } else { + Glide.with(requireContext()) + .load(user.avatar.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } + } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + "头像更新成功".show(requireContext()) + } + } + userViewModel.outResultModel.observe(viewLifecycleOwner) { + if (it.code == 200) { + AuthenticationHelper.removeToken() + requireContext().navigatePageTo() + //清除所有Activity + PageNavigationManager.finishAllActivity() + } + } + + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.uploadResult.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + it.data, + "", + user.roleList.reformat() + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userAvatarView) + } + } val isOpen = SaveKeyValues.getValue(LocaleConstant.OPEN_WARNING, false) as Boolean warningSwitch.isChecked = isOpen @@ -57,10 +130,88 @@ } override fun observeRequestState() { - + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "头像更新中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { + userAvatarView.setOnClickListener { + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(context) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(context) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.instance) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() + } + + exitLoginView.setOnClickListener { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("确定要退出吗?") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + //执行退出登录操作 + userViewModel.loginOut() + } + }).build().show() + } + + userAccountLayout.setOnClickListener { + requireContext().navigatePageTo() + } + warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) @@ -85,35 +236,47 @@ SaveKeyValues.putValue(LocaleConstant.AUTO_RECORD, false) } } - logLayout.setOnClickListener { - requireContext().navigatePageTo() + + helpLayout.setOnClickListener { + requireContext().navigatePageTo() } - loginOutButton.setOnClickListener { + + updateLayout.setOnClickListener { + "已是最新版本,无需更新".show(requireContext()) + } + + backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") - .setMessage("确定要退出吗?") + .setMessage("是否确定拨打客服的电话?") .setNegativeButton("取消") .setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { - override fun onCancelClick() { - - } - override fun onConfirmClick() { - //执行退出登录操作 - userViewModel.loginOut() - userViewModel.outResultModel.observe(this@SettingPageFragment) { - if (it.code == 200) { - AuthenticationHelper.removeToken() - requireContext().navigatePageTo() - //清除所有Activity - PageNavigationManager.finishAllActivity() - } - } + val intent = Intent() + intent.action = Intent.ACTION_CALL + intent.data = Uri.parse("tel:18310581916") + startActivity(intent) } + + override fun onCancelClick() {} }).build().show() } } + + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt index 5f8c9bf..01865c1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/LocaleConstant.kt @@ -17,6 +17,7 @@ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CAMERA, + Manifest.permission.CALL_PHONE, Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN, diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index 24f130e..1281613 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -34,6 +34,22 @@ suspend fun getLoginOutResult(@Header("token") token: String): String /** + * 更新用户信息 + */ + @FormUrlEncoded + @POST("/mgr/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Field("id") id: String, + @Field("account") account: String, + @Field("name") name: String, + @Field("deptid") deptid: String, + @Field("avatar") avatar: String, + @Field("phone") phone: String, + @Field("roleid") roleid: String + ): String + + /** * 巡检记录列表 */ @GET("/inspection/search") diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index eea6758..4c1f278 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -47,6 +47,23 @@ } /** + * 更新用户信息 + */ + suspend fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ): String { + return api.updateUserInfo( + AuthenticationHelper.token!!, id, account, name, deptid, avatar, phone, roleid + ) + } + + /** * 巡检记录列表 */ suspend fun getInspectionList( diff --git a/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt new file mode 100644 index 0000000..b943b82 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/HelpCenterActivity.kt @@ -0,0 +1,39 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import android.webkit.WebViewClient +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : KotlinBaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "帮助中心" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index f5f0d91..6c9459a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -13,10 +13,8 @@ import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.LoadState @@ -48,6 +46,17 @@ authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.userInfo.observe(this) { user -> + if (user.code == 200) { + //记录登录log + SaveKeyValues.putValue( + LocaleConstant.USER_OBJECT, gson.toJson(user) + )//保存用户对象 + + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + } } override fun observeRequestState() { @@ -94,18 +103,6 @@ AuthenticationHelper.saveToken(loginResult.data!!.token!!) userViewModel.getUserInfo() - userViewModel.userInfo.observe(this) { user -> - if (user.code == 200) { - //记录登录log - "${user.data!!.name}登录成功".writeToFile(createLogFile()) - SaveKeyValues.putValue( - LocaleConstant.USER_OBJECT, gson.toJson(user) - )//保存用户对象 - - PageNavigationManager.finishAllActivity() - navigatePageTo() - } - } } } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 876121e..da444fd 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -2,7 +2,6 @@ import android.view.KeyEvent import android.view.MenuItem -import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.viewpager.widget.ViewPager import com.amap.api.maps.MapsInitializer @@ -14,7 +13,6 @@ import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { @@ -100,8 +98,7 @@ } override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmersionBar.with(this).statusBarDarkFont(true).init() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt deleted file mode 100644 index fbb9486..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.casic.birmm.inspect.view - -import androidx.core.content.ContextCompat -import com.casic.birmm.inspect.R -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.createLogFile -import com.pengxh.kt.lite.extensions.read -import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_show_log.* -import kotlinx.android.synthetic.main.include_base_title.* - -class ShowLogActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_show_log - - override fun setupTopBarLayout() { - ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) - ImmersionBar.with(this).statusBarDarkFont(false).init() - titleView.text = "日志" - } - - override fun observeRequestState() { - - } - - override fun initData() { - userLoginLogView.text = createLogFile().read() - } - - override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt new file mode 100644 index 0000000..92ea1f6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserDetailActivity.kt @@ -0,0 +1,52 @@ +package com.casic.birmm.inspect.view + +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.vm.UserViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import kotlinx.android.synthetic.main.activity_user_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + +class UserDetailActivity : KotlinBaseActivity() { + + private lateinit var userViewModel: UserViewModel + + override fun initLayoutView(): Int = R.layout.activity_user_detail + + override fun setupTopBarLayout() { + ImmerseStatusBarUtil.setColor(this, ContextCompat.getColor(this, R.color.themeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + + titleView.text = "个人资料" + leftBackView.visibility = View.VISIBLE + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] + userViewModel.getUserInfo() + userViewModel.userInfo.observe(this) { + if (it.code == 200) { + val user = it.data + + userNameView.text = user.account + userRealNameView.text = user.name + userDeptView.text = user.deptName + userPhoneView.text = user.phone + ipAddressView.text = user.ipAddr + } + } + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index dba8d11..a6ae8ab 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -25,6 +25,7 @@ val loginResult = MutableLiveData() val userInfo = MutableLiveData() val outResultModel = MutableLiveData() + val updateResult = MutableLiveData() fun getLoginResult(account: String, secretKey: String) = launch({ loadState.value = LoadState.Loading @@ -69,4 +70,33 @@ }, { it.cause.toString().show(BaseApplication.get()) }) + + fun updateUserInfo( + id: String, + account: String, + name: String, + deptid: String, + avatar: String, + phone: String, + roleid: String + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo( + id, account, name, deptid, avatar, phone, roleid + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + updateResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.cause.toString().show(BaseApplication.get()) + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/avatar_border_circle.xml b/app/src/main/res/drawable/avatar_border_circle.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/avatar_border_circle.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_white_radius_10.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml new file mode 100644 index 0000000..f0334b3 --- /dev/null +++ b/app/src/main/res/drawable/ic_account.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_add_black.xml b/app/src/main/res/drawable/ic_add_black.xml new file mode 100644 index 0000000..4a7fb89 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_app.xml b/app/src/main/res/drawable/ic_app.xml new file mode 100644 index 0000000..c3befbe --- /dev/null +++ b/app/src/main/res/drawable/ic_app.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_call.xml b/app/src/main/res/drawable/ic_call.xml new file mode 100644 index 0000000..e1ffad5 --- /dev/null +++ b/app/src/main/res/drawable/ic_call.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_exit.xml b/app/src/main/res/drawable/ic_exit.xml new file mode 100644 index 0000000..a1e3ac6 --- /dev/null +++ b/app/src/main/res/drawable/ic_exit.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..184199a --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..ca3826a 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,74 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:android="http://schemas.android.com/apk/res/android"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_sound.xml b/app/src/main/res/drawable/ic_sound.xml new file mode 100644 index 0000000..8943024 --- /dev/null +++ b/app/src/main/res/drawable/ic_sound.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_statement.xml b/app/src/main/res/drawable/ic_statement.xml new file mode 100644 index 0000000..4a3025e --- /dev/null +++ b/app/src/main/res/drawable/ic_statement.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 0000000..2b145d0 --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/switch_background_off.xml b/app/src/main/res/drawable/switch_background_off.xml index 1b04eb9..e82f94c 100644 --- a/app/src/main/res/drawable/switch_background_off.xml +++ b/app/src/main/res/drawable/switch_background_off.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_background_on.xml b/app/src/main/res/drawable/switch_background_on.xml index d3313a6..38f04a4 100644 --- a/app/src/main/res/drawable/switch_background_on.xml +++ b/app/src/main/res/drawable/switch_background_on.xml @@ -2,9 +2,9 @@ - + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_circle_off.xml b/app/src/main/res/drawable/switch_circle_off.xml index 87a16cf..c049f3d 100644 --- a/app/src/main/res/drawable/switch_circle_off.xml +++ b/app/src/main/res/drawable/switch_circle_off.xml @@ -2,8 +2,8 @@ + android:width="20dp" + android:height="20dp" /> + android:width="20dp" + android:height="20dp" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml deleted file mode 100644 index 8cdcc8b..0000000 --- a/app/src/main/res/layout/activity_show_log.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_detail.xml b/app/src/main/res/layout/activity_user_detail.xml new file mode 100644 index 0000000..a2bb202 --- /dev/null +++ b/app/src/main/res/layout/activity_user_detail.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_map_inspect.xml b/app/src/main/res/layout/fragment_map_inspect.xml index ae1171e..568e19e 100644 --- a/app/src/main/res/layout/fragment_map_inspect.xml +++ b/app/src/main/res/layout/fragment_map_inspect.xml @@ -6,7 +6,11 @@ android:background="@color/white" android:orientation="vertical"> - + + +
- + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_height="wrap_content" + android:layout_marginHorizontal="@dimen/dp_10" + android:background="@drawable/bg_solid_layout_white_radius_10" + android:orientation="vertical"> - + - - - - - - - - - - - - - - - - + style="@style/mainFragmentTextStyle" + android:text="声音/震动" /> + android:track="@drawable/select_switch_background" + tools:ignore="UseSwitchCompatOrMaterialXml" /> - + - + + + + android:track="@drawable/select_switch_background" + tools:ignore="UseSwitchCompatOrMaterialXml" /> + - + - - + style="@style/leftImageStyle" + android:background="@drawable/ic_info" /> + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + - - - -