diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml new file mode 100644 index 0000000..de77290 --- /dev/null +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml new file mode 100644 index 0000000..de77290 --- /dev/null +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml new file mode 100644 index 0000000..82c95a8 --- /dev/null +++ b/app/src/main/res/layout/activity_show_log.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml new file mode 100644 index 0000000..de77290 --- /dev/null +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml new file mode 100644 index 0000000..82c95a8 --- /dev/null +++ b/app/src/main/res/layout/activity_show_log.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_settings.xml b/app/src/main/res/layout/activity_user_settings.xml index 362d44a..b681e80 100644 --- a/app/src/main/res/layout/activity_user_settings.xml +++ b/app/src/main/res/layout/activity_user_settings.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> @@ -82,7 +80,9 @@ - + - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml new file mode 100644 index 0000000..de77290 --- /dev/null +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml new file mode 100644 index 0000000..82c95a8 --- /dev/null +++ b/app/src/main/res/layout/activity_show_log.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_settings.xml b/app/src/main/res/layout/activity_user_settings.xml index 362d44a..b681e80 100644 --- a/app/src/main/res/layout/activity_user_settings.xml +++ b/app/src/main/res/layout/activity_user_settings.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> @@ -82,7 +80,9 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml new file mode 100644 index 0000000..de77290 --- /dev/null +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml new file mode 100644 index 0000000..82c95a8 --- /dev/null +++ b/app/src/main/res/layout/activity_show_log.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_settings.xml b/app/src/main/res/layout/activity_user_settings.xml index 362d44a..b681e80 100644 --- a/app/src/main/res/layout/activity_user_settings.xml +++ b/app/src/main/res/layout/activity_user_settings.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> @@ -82,7 +80,9 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/raw/alarm.mp3 b/app/src/main/res/raw/alarm.mp3 new file mode 100644 index 0000000..af744ca --- /dev/null +++ b/app/src/main/res/raw/alarm.mp3 Binary files differ diff --git a/app/build.gradle b/app/build.gradle index c9fe38c..0c8230b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,8 +66,10 @@ implementation 'com.squareup.okhttp3:okhttp:4.6.0' //官方Json解析库 implementation 'com.google.code.gson:gson:2.8.6' + //上拉加载下拉刷新 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' + //日期选择器 + implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' //图片选择框架 // implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' - //上拉加载下拉刷新 -// implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ed6ab1..aa3e1d4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,7 +7,7 @@ - + @@ -36,6 +36,8 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt new file mode 100644 index 0000000..8f0278c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/InspectListAdapter.kt @@ -0,0 +1,62 @@ +package com.casic.birmm.inspect.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.model.InspectModel + + +class InspectListAdapter( + context: Context, + dataRows: MutableList +) : RecyclerView.Adapter() { + + private val dataRows: MutableList? = dataRows + private var layoutInflater: LayoutInflater? = null + + init { + layoutInflater = LayoutInflater.from(context) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view: View = + layoutInflater!!.inflate(R.layout.item_inspect_recycleview, parent, false) + return ItemViewHolder(view) + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + holder.inspectDateView.text = rowsBean.date + holder.inspectNameView.text = rowsBean.user + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClick(position) + } + } + } + + override fun getItemCount(): Int = dataRows!!.size + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var inspectMessageView: TextView = view.findViewById(R.id.inspectMessageView) + var inspectDateView: TextView = view.findViewById(R.id.inspectDateView) + var inspectNameView: TextView = view.findViewById(R.id.inspectNameView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt index 9affee1..5ba27f1 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseActivity.kt @@ -2,6 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -16,8 +18,12 @@ setContentView(initLayoutView()) QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } /** diff --git a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt index e3a6c03..0d2bc90 100644 --- a/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/base/BaseViewModelActivity.kt @@ -4,6 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.ToastHelper import com.qmuiteam.qmui.util.QMUIStatusBarHelper import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.MainScope @@ -20,6 +22,11 @@ protected lateinit var viewModel: VM /** + * 提供ViewModel类 + */ + protected abstract fun createViewModelByClass(): Class? + + /** * 初始化xml布局 */ protected abstract fun initLayoutView(): Int @@ -39,19 +46,18 @@ */ abstract fun initEvent() - /** - * 提供ViewModel类 - */ - protected abstract fun createViewModelByClass(): Class? - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(initLayoutView()) createViewModelByClass()?.let { viewModel = ViewModelProvider(this).get(it) } QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 setupTopBarLayout() - initData() - initEvent() + if (OtherUtils.isNetworkConnected(this)) { + initData() + initEvent() + } else { + ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + } } override fun onDestroy() { diff --git a/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt new file mode 100644 index 0000000..558e716 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/InspectModel.kt @@ -0,0 +1,43 @@ +package com.casic.birmm.inspect.model + +class InspectModel { + + var code = 0 + var data: DataBean? = null + var message: String? = null + var isSuccess = false + + class DataBean { + + var total = 0 + var rows: MutableList? = null + + class RowsBean { + /** + * date : 2021年07月08日 + * endLat : 39.915908 + * endLng : 116.26876 + * endTime : 2021-07-08 11:20:20 + * id : 162570318141612121 + * name : 测试 + * routes : [[116.2694615342882,39.913364800347225],[116.26944390190972,39.913723415798614],[116.2694420030382,39.91406846788195],[116.26944363064236,39.91439860026042],[116.268654,39.915826],[116.268759765625,39.91590766059028]] + * startLat : 39.913365 + * startLng : 116.269462 + * startTime : 2021-07-08 08:13:01 + * user : 王晓颖 + */ + var date: String? = null + var endLat = 0.0 + var endLng = 0.0 + var endTime: String? = null + var id: String? = null + var name: String? = null + var routes: String? = null + var startLat = 0.0 + var startLng = 0.0 + var startTime: String? = null + var user: String? = null + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 981afb0..c27772f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -10,6 +10,9 @@ ) const val PERMISSIONS_CODE = 999 + const val PAGE_LIMIT = 15 + + const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val USER_OBJECT = "userObject" diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt index 070b1fd..f67181c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/OtherUtils.kt @@ -1,8 +1,14 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.media.AudioAttributes +import android.media.AudioManager +import android.media.SoundPool +import android.net.ConnectivityManager +import android.os.Build import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + object OtherUtils { private var loadingDialog: QMUITipDialog? = null @@ -22,4 +28,48 @@ } } } + + /** + * 判断是否有网络连接 + * @param context + * @return + */ + fun isNetworkConnected(context: Context?): Boolean { //true是链接,false是没链接 + if (context != null) { + val manager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + if (manager == null) { + return false + } else { + val netWorkInfo = manager.activeNetworkInfo + if (netWorkInfo != null) { + return netWorkInfo.isAvailable + } + } + } + return false + } + + fun playSound(context: Context?, resId: Int) { + if (context == null) return + val soundPool: SoundPool + soundPool = if (Build.VERSION.SDK_INT >= 21) { + val builder = SoundPool.Builder() + builder.setMaxStreams(1) + val attrBuilder = AudioAttributes.Builder() + attrBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC) + builder.setAudioAttributes(attrBuilder.build()) + builder.build() + } else { + SoundPool(1, AudioManager.STREAM_SYSTEM, 5) + } + if (resId == 0) { + soundPool.autoPause() + } else { + soundPool.load(context, resId, 1) + soundPool.setOnLoadCompleteListener { it: SoundPool, _: Int, _: Int -> + it.play(1, 1f, 1f, 0, 0, 1f) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt new file mode 100644 index 0000000..4a6655c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/PageNavigationManager.kt @@ -0,0 +1,70 @@ +package com.casic.birmm.inspect.utils + +import android.app.Activity +import java.util.* + +/** + * 统一管理所有Activity + * */ +object PageNavigationManager { + private var activityStack = Stack() + + /** + * 添加Activity到堆栈 + */ + fun addActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.push(activity) + } + + /** + * 获取当前Activity(堆栈中最后一个压入的) + */ + fun currentActivity(): Activity? { + return activityStack.lastElement() + } + + /** + * 结束当前Activity(堆栈中最后一个压入的) + */ + fun finishCurrentActivity() { + val activity = activityStack.pop() + activity.finish() + } + + /** + * 结束指定的Activity + */ + private fun finishActivity(activity: Activity?) { + if (activity == null) { + return + } + activityStack.remove(activity) + if (!activity.isFinishing) { + activity.finish() + } + } + + /** + * 结束指定类名的Activity + */ + fun finishActivity(clazz: Class) { + activityStack.forEach { + if (it.javaClass == clazz) { + finishActivity(it) + } + } + } + + /** + * 结束所有Activity + */ + fun finishAllActivity() { + activityStack.forEach { + it?.finish() + } + activityStack.clear() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt new file mode 100644 index 0000000..fda39c6 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/TimeOrDateUtil.kt @@ -0,0 +1,47 @@ +package com.casic.birmm.inspect.utils + +import java.text.SimpleDateFormat +import java.util.* + +object TimeOrDateUtil { + private val allDateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA) + private val dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) + private val timeFormat = SimpleDateFormat("HH:mm:ss", Locale.CHINA) + private val minuteFormat = SimpleDateFormat("HH:mm", Locale.CHINA) + private val secondsFormat = SimpleDateFormat("mm:ss", Locale.CHINA) + + /** + * 时间戳转完整日期时间 + */ + fun timestampToCompleteDate(millSeconds: Long): String { + return allDateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转日期 + */ + fun timestampToDate(millSeconds: Long): String { + return dateFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时间 + */ + fun timestampToTime(millSeconds: Long): String { + return timeFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转时分 + */ + fun minuteToTime(millSeconds: Long): String { + return minuteFormat.format(Date(millSeconds)) + } + + /** + * 时间戳转分秒 + */ + fun millsToTime(millSeconds: Long): String { + return secondsFormat.format(Date(millSeconds)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt index a870f5a..115b896 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitService.kt @@ -1,9 +1,6 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import retrofit2.http.* /** @@ -38,4 +35,17 @@ */ @GET("/user/logout") suspend fun obtainLoginOutResult(@Header("token") token: String): ActionResultModel + + /** + * 巡检记录列表 + */ + @GET("/inspection/search") + suspend fun obtainInspectList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): InspectModel } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt index 4dde02f..43cfc3f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/retrofit/RetrofitServiceManager.kt @@ -1,10 +1,8 @@ package com.casic.birmm.inspect.utils.retrofit -import com.casic.birmm.inspect.model.ActionResultModel -import com.casic.birmm.inspect.model.LoginResultModel -import com.casic.birmm.inspect.model.PublicKeyModel -import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.model.* import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant object RetrofitServiceManager { @@ -38,4 +36,23 @@ suspend fun loginOut(): ActionResultModel { return api.obtainLoginOutResult(AuthenticationHelper.token!!) } + + /** + * 巡检记录列表 + */ + suspend fun queryInspect( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): InspectModel { + return api.obtainInspectList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt index cb01ce4..016fca4 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/GuideActivity.kt @@ -9,9 +9,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.AuthenticationHelper -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -25,10 +23,7 @@ override fun initLayoutView(): Int = R.layout.activity_guide override fun setupTopBarLayout() { - - } - - override fun initData() { + PageNavigationManager.addActivity(this) //根据不同设备状态栏高度设置"跳过"按钮的Margin值 val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) val rightMargin = QMUIDisplayHelper.dp2px(this, 10) @@ -37,7 +32,9 @@ params.setMargins(skipButton.width, statusBarHeight, rightMargin, 0) skipButton.requestLayout() } + } + override fun initData() { countDownTimer = object : CountDownTimer(4000, 1000) { override fun onFinish() { startLoginActivity() @@ -71,6 +68,9 @@ startActivity(Intent(this, MainActivity::class.java)) finish() }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt new file mode 100644 index 0000000..cff683a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -0,0 +1,165 @@ +package com.casic.birmm.inspect.view + +import android.os.Handler +import android.os.Message +import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.InspectListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.vm.InspectionQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_inspect.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + + +class InspectionQueryActivity : BaseViewModelActivity() { + + private var keywords = "" + private var startTime = "" + private var endTime = "" + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + private var dataBeans: MutableList = ArrayList() + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var adapter: InspectListAdapter + + override fun createViewModelByClass(): Class? = + InspectionQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_inspect + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检记录查询" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(this); + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //开始时间 + startDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择起始时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + startTime = TimeOrDateUtil.timestampToDate(millseconds) + startDateView.setText(startTime) + } + .build().show(supportFragmentManager, "startDate") + } + //结束时间 + endDateView.setOnClickListener { + TimePickerDialog.Builder() + .setThemeColor(ContextCompat.getColor(this, R.color.mainThemeColor)) + .setTitleStringId("请选择结束时间") + .setWheelItemTextSize(16) + .setCyclic(false) + .setMinMillseconds(System.currentTimeMillis() - Constant.FIVE_YEARS) + .setMaxMillseconds(System.currentTimeMillis()) + .setType(Type.YEAR_MONTH_DAY) + .setCallBack { _, millseconds -> + endTime = TimeOrDateUtil.timestampToDate(millseconds) + endDateView.setText(endTime) + } + .build().show(supportFragmentManager, "startDate") + } + + //开始搜索 + searchView.setOnClickListener { + keywords = inputTipsView.text.toString() + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryInspect(keywords, startTime, endTime, pageIndex) + } + viewModel.resultModel.observe(this, Observer { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + refreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + ToastHelper.showToast(this, "到底了,别拉了") + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210709) + } + }) + viewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + }) + } + + private class WeakReferenceHandler(activity: InspectionQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210709) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + InspectListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.inspectRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.inspectRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + InspectListAdapter.OnItemClickListener { + override fun onClick(position: Int) { +// val intent = Intent(resultActivity, InspectRouteActivity::class.java) +// intent.putExtra("id", resultActivity.dataBeans[position].id) +// resultActivity.startActivity(intent) + } + }) + } + } + } + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 36e6828..df4239c 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -26,7 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { - + PageNavigationManager.addActivity(this) } override fun initData() { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 6baf2fb..3f49b60 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -9,13 +9,11 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity -import com.casic.birmm.inspect.utils.Constant -import com.casic.birmm.inspect.utils.SaveKeyValues -import com.casic.birmm.inspect.utils.StatusBarColorUtil -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -27,6 +25,7 @@ override fun initLayoutView(): Int = R.layout.activity_main override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() leftBackView.visibility = View.GONE @@ -41,6 +40,9 @@ userViewModel.resultModel.observe(this, Observer { SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) + userViewModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "获取用户信息失败,请重试") + }) } } @@ -51,7 +53,22 @@ } //记录查询 logSearchLayout.setOnClickListener { - + QMUIBottomSheet.BottomListSheetBuilder(this) + .setTitle("选择记录类型") + .addItem("巡检记录") + .addItem("事件记录") + .setGravityCenter(true) + .setOnSheetItemClickListener { dialog, _, position, _ -> + dialog?.dismiss() + when (position) { + 0 -> { + startActivity(Intent(this, InspectionQueryActivity::class.java)) + } + 1 -> { +// startActivity(Intent(this, EventQueryActivity::class.java)) + } + } + }.build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt index 07f48a5..d4821de 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/PermissionActivity.kt @@ -5,6 +5,7 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager import pub.devrel.easypermissions.EasyPermissions import pub.devrel.easypermissions.EasyPermissions.PermissionCallbacks @@ -12,6 +13,7 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + PageNavigationManager.addActivity(this) //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (EasyPermissions.hasPermissions(this, *Constant.USER_PERMISSIONS)) { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt new file mode 100644 index 0000000..65e04d2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/ShowLogActivity.kt @@ -0,0 +1,27 @@ +package com.casic.birmm.inspect.view + +import androidx.core.content.ContextCompat +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.include_base_title.* + +class ShowLogActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_show_log + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "日志" + } + + override fun initData() { + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt index 2e73469..4039bd3 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/UserSettingsActivity.kt @@ -26,6 +26,7 @@ override fun initLayoutView(): Int = R.layout.activity_user_settings override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) ImmersionBar.with(this).statusBarDarkFont(false).init() titleView.text = "系统设置" @@ -61,8 +62,10 @@ warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(Constant.OPEN_WARNING, true) + OtherUtils.playSound(this, R.raw.alarm) vibrator.vibrate(1000) } else { + OtherUtils.playSound(this, 0) SaveKeyValues.putValue(Constant.OPEN_WARNING, false) } } @@ -73,6 +76,9 @@ SaveKeyValues.putValue(Constant.AUTO_RECORD, false) } } + logLayout.setOnClickListener { + startActivity(Intent(this, ShowLogActivity::class.java)) + } loginOutButton.setChangeAlphaWhenPress(true) loginOutButton.setOnClickListener { QMUIDialog.MessageDialogBuilder(this) @@ -99,11 +105,15 @@ LoginActivity::class.java ) ) - finish() + //清除所有Activity + PageNavigationManager.finishAllActivity() } else { ToastHelper.showToast(this@UserSettingsActivity, "操作失败") } }) + loginOutModel.loadState.observe(this, Observer { + ToastHelper.showToast(this, "操作失败,请重试") + }) }.create().show() } } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt new file mode 100644 index 0000000..91359a2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -0,0 +1,20 @@ +package com.casic.birmm.inspect.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.model.InspectModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.launch +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class InspectionQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryInspect(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryInspect(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt index fa22f6c..c60862d 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginOutViewModel.kt @@ -1,23 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.ActionResultModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginOutViewModel : BaseViewModel() { - companion object { - private const val Tag = "LoginOutViewModel" - } - val resultModel = MutableLiveData() fun loginOut() = launch({ resultModel.value = RetrofitServiceManager.loginOut() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt index f13301d..8cc84f2 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/UserViewModel.kt @@ -1,22 +1,19 @@ package com.casic.birmm.inspect.vm -import android.util.Log import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel import com.casic.birmm.inspect.model.UserInfoModel +import com.casic.birmm.inspect.utils.LoadState import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class UserViewModel : BaseViewModel() { - companion object { - private const val Tag = "UserViewModel" - } val resultModel = MutableLiveData() fun getUserInfo() = launch({ resultModel.value = RetrofitServiceManager.getUserInfo() }, { - Log.d(Tag, it.stackTrace.toString()) + loadState.value = LoadState.Fail }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_button_layout.xml b/app/src/main/res/drawable/bg_button_layout.xml new file mode 100644 index 0000000..cf000c8 --- /dev/null +++ b/app/src/main/res/drawable/bg_button_layout.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml new file mode 100644 index 0000000..92c4171 --- /dev/null +++ b/app/src/main/res/drawable/ic_search.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml new file mode 100644 index 0000000..de77290 --- /dev/null +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_log.xml b/app/src/main/res/layout/activity_show_log.xml new file mode 100644 index 0000000..82c95a8 --- /dev/null +++ b/app/src/main/res/layout/activity_show_log.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_settings.xml b/app/src/main/res/layout/activity_user_settings.xml index 362d44a..b681e80 100644 --- a/app/src/main/res/layout/activity_user_settings.xml +++ b/app/src/main/res/layout/activity_user_settings.xml @@ -1,11 +1,9 @@ + android:orientation="vertical"> @@ -82,7 +80,9 @@ - + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/raw/alarm.mp3 b/app/src/main/res/raw/alarm.mp3 new file mode 100644 index 0000000..af744ca --- /dev/null +++ b/app/src/main/res/raw/alarm.mp3 Binary files differ diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 4f14018..e9b1617 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -5,6 +5,8 @@ #03DAC5 #FFFFFF + #F9F9F9 + #EFEFEF #E5E5E5 #D3D3D3 #C0C0C0