diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..42a8339 --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..42a8339 --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_warning.xml b/app/src/main/res/layout/fragment_warning.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_warning.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..42a8339 --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_warning.xml b/app/src/main/res/layout/fragment_warning.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_warning.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_work_order.xml b/app/src/main/res/layout/fragment_work_order.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_work_order.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..42a8339 --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_warning.xml b/app/src/main/res/layout/fragment_warning.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_warning.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_work_order.xml b/app/src/main/res/layout/fragment_work_order.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_work_order.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml new file mode 100644 index 0000000..01b3721 --- /dev/null +++ b/app/src/main/res/layout/include_base_title.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..42a8339 --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_warning.xml b/app/src/main/res/layout/fragment_warning.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_warning.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_work_order.xml b/app/src/main/res/layout/fragment_work_order.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_work_order.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml new file mode 100644 index 0000000..01b3721 --- /dev/null +++ b/app/src/main/res/layout/include_base_title.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..c91b766 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3cce014..6c43077 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,8 @@ + + \ No newline at end of file diff --git a/app/src/main/assets/HelpCenterH5.html b/app/src/main/assets/HelpCenterH5.html new file mode 100644 index 0000000..ff93dbe --- /dev/null +++ b/app/src/main/assets/HelpCenterH5.html @@ -0,0 +1,26 @@ + + + + + + + + +

1、告警处理的流程是怎样的?

+  当井盖发生开盖报警时,会向所属单位的用户推送报警信息,点击推送信息即可快速进入应用首页。
+  进入【待处理】工单页面后,点击待处理工单项可进入【工单详情】页面,查看告警信息,点击闸井编号可跳转到【闸井详情】页面查看闸井信息及地图位置。
+  现场确认井盖状态正常后,在【工单详情】中的处理按钮即可结束工单并取消报警。 +

2、如何查看闸井详情?

+  首页点击【闸井管理】进入闸井列表,用户可根据闸井类型或关键字筛选自己想要了解的闸井信息,点击进行查看,或在工单详情中点击闸井编号也可以进入闸井详情。 +

3、如何查看关联设备的监控信息?

+  当有单个关联设备时,闸井详情页内可直接查看该设备监控信息及最近一次的监控数值当有多个关联设备时,闸井详情页内点击【监控内容】进入下一页,可查看多个监控信息及最近一次的监控数值。 +

4、井盖的撤防入口在哪里?

+  首页点击【布防撤防】,用户可查看自己责任片区的闸井信息并进行布防/撤防操作。闸井撤防后报警信息将不再推送,此操作需慎重。 +

5、如何查看工单详情?

+  点击首页,可在快捷口根据工单状态进入工单列表,查看工单的详细信息,也可底部菜单选【工单】,进入工单列表,查看工单的详细信息。 +

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

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

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

+  获取手机信息(IMEI)的权限,为安全访问网络,此项请务必允许。 + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt new file mode 100644 index 0000000..137814e --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/adapter/ViewPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.casic.app.smartwell.sanxi.adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentPagerAdapter + +class ViewPagerAdapter(list: MutableList, manager: FragmentManager) : + FragmentPagerAdapter(manager) { + + private var pageList: List = list + + override fun getItem(position: Int): Fragment = pageList[position] + + override fun getCount(): Int = pageList.size +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt index 70e879b..15accc4 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseActivity.kt @@ -64,7 +64,7 @@ /** * 特定页面定制沉浸式状态栏 */ - protected abstract fun setupTopBarLayout() + abstract fun setupTopBarLayout() /** * 初始化默认数据 diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt new file mode 100644 index 0000000..a2dfb29 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/base/BaseFragment.kt @@ -0,0 +1,31 @@ +package com.casic.app.smartwell.sanxi.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +abstract class BaseFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + return inflater.inflate(initLayoutView(), container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupTopBarLayout() + initData() + initEvent() + } + + abstract fun initLayoutView(): Int + + abstract fun setupTopBarLayout() + + abstract fun initData() + + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt new file mode 100644 index 0000000..26f3085 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/HomePageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class HomePageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_home + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "首页" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt new file mode 100644 index 0000000..293bbc6 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/MinePageFragment.kt @@ -0,0 +1,164 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.view.View +import androidx.core.content.FileProvider +import androidx.lifecycle.ViewModelProvider +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import com.casic.app.smartwell.sanxi.extensions.appendDownloadUrl +import com.casic.app.smartwell.sanxi.extensions.downloadFile +import com.casic.app.smartwell.sanxi.extensions.navigatePageTo +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.utils.* +import com.casic.app.smartwell.sanxi.view.AboutUsActivity +import com.casic.app.smartwell.sanxi.view.HelpCenterActivity +import com.casic.app.smartwell.sanxi.vm.UserViewModel +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.app.multilib.widget.dialog.AlertControlDialog +import kotlinx.android.synthetic.main.fragment_mine.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File + + +class MinePageFragment : BaseFragment() { + + private val gson = Gson() + private lateinit var userDataModel: UserDetailModel.Data + private lateinit var userViewModel: UserViewModel + private lateinit var progressDialog: ProgressDialog + + override fun initLayoutView(): Int = R.layout.fragment_mine + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "我的" + } + + override fun initData() { + val userDetailJson = SaveKeyValues.getValue(Constant.USER_DETAIL_MODEL, "") as String + if (userDetailJson.isNotBlank()) { + userDataModel = gson.fromJson( + userDetailJson, + object : TypeToken() {}.type + ) + userNameView.text = userDataModel.name + } + userViewModel = ViewModelProvider(this).get(UserViewModel::class.java) + //初始化下载对话框 + progressDialog = ProgressDialog(requireContext()) + progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) + progressDialog.setProgressDrawable(resources.getDrawable(R.drawable.download_progress)) + progressDialog.setCanceledOnTouchOutside(false) + progressDialog.setCancelable(false) + } + + override fun initEvent() { + userDetailLayout.setOnClickListener { +// requireContext().navigatePageTo() + } + + helpCenterLayout.setOnClickListener { + requireContext().navigatePageTo() + } + + updateVersionLayout.setOnClickListener { + userViewModel.updateVersion() + } + userViewModel.versionResultModel.observe(this, { + if (BuildConfig.VERSION_NAME == it.version) { + "已是最新版本,无需更新".show() + } else { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(it.downloadUrl) + } + + override fun onCancelClick() { + + } + }).build().show() + } + }) + userViewModel.loadState.observe(this, { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "检查版本中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + }) + + aboutUsLayout.setOnClickListener { + requireContext().navigatePageTo() + } + } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show() + return + } + /** + * http://111.198.10.15:11304/static/apk/1.0.1.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + //开始下载 + downloadPath.downloadFile(object : IDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + }) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show() + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + requireContext(), Constant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + requireContext().startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt new file mode 100644 index 0000000..2ae3653 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WarningPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WarningPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_warning + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "告警" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt new file mode 100644 index 0000000..43a5dfb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/fragment/WorkOrderPageFragment.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.fragment + +import android.view.View +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseFragment +import kotlinx.android.synthetic.main.include_base_title.* + +class WorkOrderPageFragment : BaseFragment() { + + override fun initLayoutView(): Int = R.layout.fragment_work_order + + override fun setupTopBarLayout() { + leftBackView.visibility = View.GONE + titleView.text = "工单" + } + + override fun initData() { + + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java new file mode 100644 index 0000000..236c8bd --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/model/VersionResultModel.java @@ -0,0 +1,61 @@ +package com.casic.app.smartwell.sanxi.model; + +public class VersionResultModel { + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private String downloadUrl; + private String version; + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt index 0fb1635..764104c 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitService.kt @@ -37,6 +37,12 @@ ): String /** + * 更新APK版本 + */ + @POST("/app/checkVersion") + suspend fun obtainVersionResult(@Header("token") token: String): String + + /** * 根据布防状态统计闸井数量接口 */ @GET("/well/countByBfzt") @@ -309,10 +315,4 @@ */ @GET("/user/logout") suspend fun loginOut(@Header("token") token: String): String - - /** - * 更新APK版本 - */ - @POST("/app/checkVersion") - suspend fun obtainVersionResult(@Header("token") token: String): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt index 922334d..cc53c92 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/utils/retrofit/RetrofitServiceManager.kt @@ -36,6 +36,13 @@ return api.obtainAuthorByDept(AuthenticationHelper.token!!) } + /** + * 更新APK版本 + */ + suspend fun updateVersion(): String { + return api.obtainVersionResult(AuthenticationHelper.token!!) + } + // /** // * 根据布防状态统计闸井数量接口 // */ @@ -247,11 +254,4 @@ // suspend fun loginOut(): String { // return api.loginOut(AuthenticationHelper.token!!) // } -// -// /** -// * 更新APK版本 -// */ -// suspend fun updateVersion(): String { -// return api.obtainVersionResult(AuthenticationHelper.token!!) -// } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt new file mode 100644 index 0000000..36b0217 --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/AboutUsActivity.kt @@ -0,0 +1,24 @@ +package com.casic.app.smartwell.sanxi.view + +import com.casic.app.smartwell.sanxi.BuildConfig +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_about_us.* +import kotlinx.android.synthetic.main.include_base_title.* + +class AboutUsActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_about_us + + override fun setupTopBarLayout() { + titleView.text = "关于我们" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt new file mode 100644 index 0000000..05634bb --- /dev/null +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/HelpCenterActivity.kt @@ -0,0 +1,27 @@ +package com.casic.app.smartwell.sanxi.view + +import android.webkit.WebViewClient +import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.base.BaseActivity +import kotlinx.android.synthetic.main.activity_help_center.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class HelpCenterActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_help_center + + override fun setupTopBarLayout() { + titleView.text = "帮助中心" + leftBackView.setOnClickListener { finish() } + } + + override fun initData() { + answerView.loadUrl("file:///android_asset/HelpCenterH5.html") + answerView.settings.defaultTextEncodingName = "utf-8" + answerView.webViewClient = WebViewClient() + } + + override fun initEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt index 7b12962..a44be2a 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/LoginActivity.kt @@ -44,8 +44,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { -// //设置状态栏黑色字体图标 -// QMUIStatusBarHelper.setStatusBarLightMode(this) + } override fun initData() { diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt index 5558062..c55b666 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/view/MainActivity.kt @@ -1,10 +1,32 @@ package com.casic.app.smartwell.sanxi.view +import android.view.KeyEvent +import android.view.MenuItem +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager import com.casic.app.smartwell.sanxi.R +import com.casic.app.smartwell.sanxi.adapter.ViewPagerAdapter import com.casic.app.smartwell.sanxi.base.BaseActivity +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.fragment.HomePageFragment +import com.casic.app.smartwell.sanxi.fragment.MinePageFragment +import com.casic.app.smartwell.sanxi.fragment.WarningPageFragment +import com.casic.app.smartwell.sanxi.fragment.WorkOrderPageFragment +import kotlinx.android.synthetic.main.activity_main.* class MainActivity : BaseActivity() { + private var menuItem: MenuItem? = null + private var fragmentList: MutableList = ArrayList() + private var clickTime: Long = 0 + + init { + fragmentList.add(HomePageFragment()) + fragmentList.add(WorkOrderPageFragment()) + fragmentList.add(WarningPageFragment()) + fragmentList.add(MinePageFragment()) + } + override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { @@ -12,10 +34,63 @@ } override fun initData() { - + bottomNavigation.itemIconTintList = null + bottomNavigation.setOnNavigationItemSelectedListener { menuItem -> + when (menuItem.itemId) { + R.id.nav_home -> { + mainViewPager.currentItem = 0 + } + R.id.nav_order -> { + mainViewPager.currentItem = 1 + } + R.id.nav_waring -> { + mainViewPager.currentItem = 2 + } + R.id.nav_mine -> { + mainViewPager.currentItem = 3 + } + } + false + } + mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun initEvent() { + mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + if (menuItem != null) { + menuItem!!.isChecked = false + } else { + bottomNavigation.menu.getItem(0).isChecked = false + } + menuItem = bottomNavigation.menu.getItem(position) + menuItem!!.isChecked = true + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + return if (keyCode == KeyEvent.KEYCODE_BACK) { + if (System.currentTimeMillis() - clickTime > 2000) { + "再按一次退出程序".show() + clickTime = System.currentTimeMillis() + true + } else { + super.onKeyDown(keyCode, event) + } + } else super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt index 1e35b0c..a9c44bb 100644 --- a/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/app/smartwell/sanxi/vm/UserViewModel.kt @@ -4,8 +4,12 @@ import com.casic.app.smartwell.sanxi.base.BaseViewModel import com.casic.app.smartwell.sanxi.extensions.launch import com.casic.app.smartwell.sanxi.extensions.separateResponseCode +import com.casic.app.smartwell.sanxi.extensions.show +import com.casic.app.smartwell.sanxi.extensions.toErrorMessage import com.casic.app.smartwell.sanxi.model.UserDetailModel +import com.casic.app.smartwell.sanxi.model.VersionResultModel import com.casic.app.smartwell.sanxi.utils.Constant +import com.casic.app.smartwell.sanxi.utils.LoadState import com.casic.app.smartwell.sanxi.utils.SaveKeyValues import com.casic.app.smartwell.sanxi.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson @@ -15,8 +19,9 @@ private val gson = Gson() val userDetailModel = MutableLiveData() + val versionResultModel = MutableLiveData() // val subordinateModel = MutableLiveData() -// val versionResultModel = MutableLiveData() + fun obtainUserDetail() = launch({ val response = RetrofitServiceManager.obtainUserDetail() @@ -38,6 +43,25 @@ it.printStackTrace() }) + + fun updateVersion() = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateVersion() + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + versionResultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ).data + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show() + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + /** * 转单下一级人员 * */ @@ -70,22 +94,4 @@ // loadState.value = LoadState.Fail // it.printStackTrace() // }) -// -// fun updateVersion() = launch({ -// loadState.value = LoadState.Loading -// val response = RetrofitServiceManager.updateVersion() -// val responseCode = response.separateResponseCode() -// if (responseCode == 200) { -// loadState.value = LoadState.Success -// versionResultModel.value = gson.fromJson( -// response, object : TypeToken() {}.type -// ).data -// } else { -// loadState.value = LoadState.Fail -// response.toErrorMessage().show() -// } -// }, { -// loadState.value = LoadState.Fail -// it.printStackTrace() -// }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_layout.xml b/app/src/main/res/drawable/bg_layout.xml new file mode 100644 index 0000000..f00d59c --- /dev/null +++ b/app/src/main/res/drawable/bg_layout.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_relative_layout.xml b/app/src/main/res/drawable/bg_relative_layout.xml deleted file mode 100644 index f00d59c..0000000 --- a/app/src/main/res/drawable/bg_relative_layout.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_text_color.xml b/app/src/main/res/drawable/bottom_text_color.xml new file mode 100644 index 0000000..b284ea3 --- /dev/null +++ b/app/src/main/res/drawable/bottom_text_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml new file mode 100644 index 0000000..493d923 --- /dev/null +++ b/app/src/main/res/drawable/download_progress.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_selector.xml b/app/src/main/res/drawable/home_selector.xml new file mode 100644 index 0000000..7c8ec4f --- /dev/null +++ b/app/src/main/res/drawable/home_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_android_studio.xml b/app/src/main/res/drawable/ic_android_studio.xml index d454d2a..f183393 100644 --- a/app/src/main/res/drawable/ic_android_studio.xml +++ b/app/src/main/res/drawable/ic_android_studio.xml @@ -1,6 +1,6 @@ + + diff --git a/app/src/main/res/drawable/ic_home_selected.xml b/app/src/main/res/drawable/ic_home_selected.xml new file mode 100644 index 0000000..aabb0ca --- /dev/null +++ b/app/src/main/res/drawable/ic_home_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_left.xml b/app/src/main/res/drawable/ic_left.xml new file mode 100644 index 0000000..04ee5da --- /dev/null +++ b/app/src/main/res/drawable/ic_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine.xml b/app/src/main/res/drawable/ic_mine.xml new file mode 100644 index 0000000..cd8f1e5 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_mine_selected.xml b/app/src/main/res/drawable/ic_mine_selected.xml new file mode 100644 index 0000000..30851c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_mine_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_order.xml b/app/src/main/res/drawable/ic_order.xml new file mode 100644 index 0000000..a28cdd9 --- /dev/null +++ b/app/src/main/res/drawable/ic_order.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_order_selected.xml b/app/src/main/res/drawable/ic_order_selected.xml new file mode 100644 index 0000000..11f3e46 --- /dev/null +++ b/app/src/main/res/drawable/ic_order_selected.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_right.xml b/app/src/main/res/drawable/ic_right.xml new file mode 100644 index 0000000..6020f09 --- /dev/null +++ b/app/src/main/res/drawable/ic_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning.xml b/app/src/main/res/drawable/ic_warning.xml new file mode 100644 index 0000000..852535d --- /dev/null +++ b/app/src/main/res/drawable/ic_warning.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_warning_selected.xml b/app/src/main/res/drawable/ic_warning_selected.xml new file mode 100644 index 0000000..f3b5934 --- /dev/null +++ b/app/src/main/res/drawable/ic_warning_selected.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/mine_selector.xml b/app/src/main/res/drawable/mine_selector.xml new file mode 100644 index 0000000..b9b0110 --- /dev/null +++ b/app/src/main/res/drawable/mine_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/order_selector.xml b/app/src/main/res/drawable/order_selector.xml new file mode 100644 index 0000000..dc55e57 --- /dev/null +++ b/app/src/main/res/drawable/order_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/warning_selector.xml b/app/src/main/res/drawable/warning_selector.xml new file mode 100644 index 0000000..4fee1ab --- /dev/null +++ b/app/src/main/res/drawable/warning_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..f2445d8 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_help_center.xml b/app/src/main/res/layout/activity_help_center.xml new file mode 100644 index 0000000..64dfc15 --- /dev/null +++ b/app/src/main/res/layout/activity_help_center.xml @@ -0,0 +1,25 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cb3f4a..da5a46f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,27 @@ - - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mine.xml b/app/src/main/res/layout/fragment_mine.xml new file mode 100644 index 0000000..42a8339 --- /dev/null +++ b/app/src/main/res/layout/fragment_mine.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_warning.xml b/app/src/main/res/layout/fragment_warning.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_warning.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_work_order.xml b/app/src/main/res/layout/fragment_work_order.xml new file mode 100644 index 0000000..7015d7b --- /dev/null +++ b/app/src/main/res/layout/fragment_work_order.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/include_base_title.xml b/app/src/main/res/layout/include_base_title.xml new file mode 100644 index 0000000..01b3721 --- /dev/null +++ b/app/src/main/res/layout/include_base_title.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml new file mode 100644 index 0000000..c91b766 --- /dev/null +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f69dbbe..47404a9 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -44,4 +44,41 @@ @color/hintColor @color/mainThemeColor + + + + + + + + + + + +