diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + AuthenticationHelper.token!!, + keywords, + startTime, + endTime, + Constant.PAGE_LIMIT, + pageIndex + ) + } } \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(keywords, startTime, endTime, pageIndex) + }, { + loadState.value = LoadState.Fail + }) +} \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml index de77290..945dfb6 100644 --- a/app/src/main/res/layout/activity_query_inspect.xml +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -2,7 +2,7 @@ diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml index de77290..945dfb6 100644 --- a/app/src/main/res/layout/activity_query_inspect.xml +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml index de77290..945dfb6 100644 --- a/app/src/main/res/layout/activity_query_inspect.xml +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_image_gridview.xml b/app/src/main/res/layout/item_image_gridview.xml new file mode 100644 index 0000000..84868e0 --- /dev/null +++ b/app/src/main/res/layout/item_image_gridview.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml index de77290..945dfb6 100644 --- a/app/src/main/res/layout/activity_query_inspect.xml +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_image_gridview.xml b/app/src/main/res/layout/item_image_gridview.xml new file mode 100644 index 0000000..84868e0 --- /dev/null +++ b/app/src/main/res/layout/item_image_gridview.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e9b1617..92f3cdc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #FFFFFF #F9F9F9 - #EFEFEF + #EFEFEF #E5E5E5 #D3D3D3 #C0C0C0 diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml index de77290..945dfb6 100644 --- a/app/src/main/res/layout/activity_query_inspect.xml +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_image_gridview.xml b/app/src/main/res/layout/item_image_gridview.xml new file mode 100644 index 0000000..84868e0 --- /dev/null +++ b/app/src/main/res/layout/item_image_gridview.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e9b1617..92f3cdc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #FFFFFF #F9F9F9 - #EFEFEF + #EFEFEF #E5E5E5 #D3D3D3 #C0C0C0 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f88da9d..176b516 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -76,4 +76,14 @@ true true + + diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..803804e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +inspect_app \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 0c8230b..bf4de11 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -70,6 +70,8 @@ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0' //日期选择器 implementation 'com.jzxiang.pickerview:TimePickerDialog:1.0.1' + //图片加载框架 + implementation 'com.github.bumptech.glide:glide:4.9.0' //图片选择框架 -// implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' + implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa3e1d4..0c3455d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,6 +38,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt new file mode 100644 index 0000000..7520133 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/EventListAdapter.kt @@ -0,0 +1,64 @@ +package com.casic.birmm.inspect.adapter + +import android.annotation.SuppressLint +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.EventModel + + +class EventListAdapter( + 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) + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows?.get(position)!! + holder.inspectMessageView.text = rowsBean.name + " - " + rowsBean.type + holder.inspectDateView.text = rowsBean.createTime + 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/adapter/ImageRecycleViewAdapter.kt b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt new file mode 100644 index 0000000..3efd655 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/adapter/ImageRecycleViewAdapter.kt @@ -0,0 +1,50 @@ +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.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.casic.birmm.inspect.R + +class ImageRecycleViewAdapter(private val context: Context, private val images: List) : + RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + val view = LayoutInflater.from(context).inflate(R.layout.item_image_gridview, parent, false) + return ItemViewHolder(view) + } + + override fun getItemCount(): Int { + return images.size + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + Glide.with(context) + .load(images[position]) + .apply(RequestOptions().error(R.drawable.ic_load_error)) + .into(holder.imageView) + holder.itemView.setOnClickListener { itemClickListener!!.onClick(position) } + } + + class ItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val imageView: ImageView = itemView.findViewById(R.id.imageView) + } + + private var itemClickListener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClick(position: Int) + } + + fun setOnItemClickListener(listener: OnItemClickListener?) { + itemClickListener = listener + } +} \ 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 5ba27f1..74da1e2 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,8 +2,8 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import com.casic.birmm.inspect.extensions.show 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 @@ -22,7 +22,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(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 0d2bc90..93b7592 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,8 +4,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.casic.birmm.inspect.extensions.show 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 @@ -56,7 +56,7 @@ initData() initEvent() } else { - ToastHelper.showToast(this, "糟糕,没有接入任何网络~") + "糟糕,没有接入任何网络~".show(this) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt new file mode 100644 index 0000000..1f700ab --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/String.kt @@ -0,0 +1,85 @@ +package com.casic.birmm.inspect.extensions + +import android.content.Context +import android.graphics.Color +import android.text.TextUtils +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import java.util.regex.Pattern + +/** + * String扩展方法 + */ + +//过滤空格,回车 +fun String.filterString(): String { + if (TextUtils.isEmpty(this)) { + return this + } + val s: String + //先过滤回车换行 + val p = Pattern.compile("\\s*|\t|\r|\n") + val m = p.matcher(this) + s = m.replaceAll("") + //再过滤空格 + return s.trim { it <= ' ' }.replace(" ", "") +} + +//拼接图片地址 +fun String.combineImagePath(): String { + val defaultValue = SaveKeyValues.getValue( + Constant.DEFAULT_SERVER_CONFIG, + "http://111.198.10.15:12204" + ) as String + return "$defaultValue/static/$this" +} + + +//将Toast扩展到String +fun String.show(context: Context) { + val toast = Toast(context) + val textView = TextView(context) + textView.setBackgroundResource(R.drawable.bg_toast_layout) + textView.setTextColor(Color.WHITE) + textView.textSize = 16.0f + textView.text = this + textView.setPadding( + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10), + QMUIDisplayHelper.dp2px(context, 20), + QMUIDisplayHelper.dp2px(context, 10) + ) + toast.setGravity(Gravity.CENTER, 0, 0) + toast.view = textView + toast.duration = Toast.LENGTH_SHORT + toast.show() +} + +//判断是否是数字和字母 +fun String.isLetterAndDigit(): Boolean { + var isDigit = false + var isLetter = false + for (i in this.indices) { + if (Character.isDigit(this[i])) { + isDigit = true + } else if (Character.isLetter(this[i])) { + isLetter = true + } + } + return isDigit && isLetter +} + +fun String.isPhoneNumber(): Boolean { + val regExp = + "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" + return if (this.length != 11) { + false + } else { + Pattern.compile(regExp).matcher(this).matches() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt new file mode 100644 index 0000000..04bc97c --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ViewModel.kt @@ -0,0 +1,33 @@ +package com.casic.birmm.inspect.extensions + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch + +/** + * ViewModel扩展方法:启动协程 + * @param block 协程逻辑 + * @param onError 错误回调方法 + * @param onComplete 完成回调方法 + */ +fun ViewModel.launch( + block: suspend CoroutineScope.() -> Unit, + onError: (e: Throwable) -> Unit = {}, + onComplete: () -> Unit = {} +) { + viewModelScope.launch( + CoroutineExceptionHandler { _, throwable -> + run { + onError(throwable) + } + } + ) { + try { + block.invoke(this) + } finally { + onComplete() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt new file mode 100644 index 0000000..de499aa --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/model/EventModel.kt @@ -0,0 +1,41 @@ +package com.casic.birmm.inspect.model + +class EventModel { + 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 { + /** + * createTime : 2020-12-28 14:56:59 + * data : -1 + * description : ggg + * id : t1609138629320112121 + * images : 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * inspectionId : 1609138451543200022 + * lat : 39.915956 + * lng : 116.268596 + * name : sss + * type : 自定义事件 + * user : 超超级管理员 + */ + var createTime: String? = null + var data = 0 + var description: String? = null + var id: String? = null + var images: String? = null + var inspectionId: String? = null + var lat = 0.0 + var lng = 0.0 + var name: String? = null + var type: String? = null + var user: String? = null + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt deleted file mode 100644 index 2259965..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ExtensionViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.casic.birmm.inspect.utils - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.CoroutineExceptionHandler -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -/** - * ViewModel扩展方法:启动协程 - * @param block 协程逻辑 - * @param onError 错误回调方法 - * @param onComplete 完成回调方法 - */ -fun ViewModel.launch( - block: suspend CoroutineScope.() -> Unit, - onError: (e: Throwable) -> Unit = {}, - onComplete: () -> Unit = {} -) { - viewModelScope.launch( - CoroutineExceptionHandler { _, throwable -> - run { - onError(throwable) - } - } - ) { - try { - block.invoke(this) - } finally { - onComplete() - } - } -} \ No newline at end of file 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 f67181c..3265619 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,11 +1,13 @@ package com.casic.birmm.inspect.utils import android.content.Context +import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.SoundPool import android.net.ConnectivityManager import android.os.Build +import com.casic.birmm.inspect.view.BigImageActivity import com.qmuiteam.qmui.widget.dialog.QMUITipDialog @@ -72,4 +74,12 @@ } } } + + //查看大图 + fun showBigImage(context: Context, index: Int, imageList: ArrayList?) { + val intent = Intent(context, BigImageActivity::class.java) + intent.putExtra("index", index) + intent.putStringArrayListExtra("images", imageList) + context.startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt deleted file mode 100644 index 95ecbbd..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/StringHelper.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.text.TextUtils -import java.util.regex.Pattern - -object StringHelper { - - fun isLetterAndDigit(str: String): Boolean { - var isDigit = false - var isLetter = false - for (i in str.indices) { - if (Character.isDigit(str[i])) { - isDigit = true - } else if (Character.isLetter(str[i])) { - isLetter = true - } - } - return isDigit && isLetter - } - - fun isPhoneNumber(number: String): Boolean { - val regExp = - "^[1](([3][0-9])|([4][5-9])|([5][0-3,5-9])|([6][5,6])|([7][0-8])|([8][0-9])|([9][1,8,9]))[0-9]{8}$" - return if (number.length != 11) { - false - } else { - Pattern.compile(regExp).matcher(number).matches() - } - } - - /** - * 过滤空格,回车 - */ - fun filterString(str: String): String { - if (TextUtils.isEmpty(str)) { - return str - } - val s: String - //先过滤回车换行 - val p = Pattern.compile("\\s*|\t|\r|\n") - val m = p.matcher(str) - s = m.replaceAll("") - //再过滤空格 - return s.trim { it <= ' ' }.replace(" ", "") - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt b/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt deleted file mode 100644 index 0ed4ff4..0000000 --- a/app/src/main/java/com/casic/birmm/inspect/utils/ToastHelper.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.casic.birmm.inspect.utils - -import android.content.Context -import android.graphics.Color -import android.view.Gravity -import android.widget.TextView -import android.widget.Toast -import com.casic.birmm.inspect.R -import com.qmuiteam.qmui.util.QMUIDisplayHelper - - -object ToastHelper { - fun showToast(context: Context, message: String) { - val toast = Toast(context) - val textView = TextView(context) - textView.setBackgroundResource(R.drawable.bg_toast_layout) - textView.setTextColor(Color.WHITE) - textView.textSize = 16.0f - textView.text = message - textView.setPadding( - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10), - QMUIDisplayHelper.dp2px(context, 20), - QMUIDisplayHelper.dp2px(context, 10) - ) - toast.setGravity(Gravity.CENTER, 0, 0) - toast.view = textView - toast.duration = Toast.LENGTH_SHORT - toast.show() - } -} \ 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 115b896..ce426a3 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 @@ -48,4 +48,17 @@ @Query("limit") limit: Int, @Query("offset") offset: Int ): InspectModel + + /** + * 巡检记录列表 + */ + @GET("/task/search") + suspend fun obtainEventList( + @Header("token") token: String, + @Query("keywords") keywords: String, + @Query("startTime") startTime: String, + @Query("endTime") endTime: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int + ): EventModel } \ 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 43cfc3f..673ce3d 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 @@ -55,4 +55,23 @@ pageIndex ) } + + /** + * 事件记录列表 + */ + suspend fun queryEvent( + keywords: String, + startTime: String, + endTime: String, + pageIndex: Int + ): EventModel { + return api.obtainEventList( + 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/BigImageActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt new file mode 100644 index 0000000..4916c38 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/BigImageActivity.kt @@ -0,0 +1,96 @@ +package com.casic.birmm.inspect.view; + +import android.annotation.SuppressLint +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.core.content.ContextCompat +import androidx.viewpager.widget.PagerAdapter +import androidx.viewpager.widget.ViewPager +import com.bumptech.glide.Glide +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 com.luck.picture.lib.photoview.PhotoView +import kotlinx.android.synthetic.main.activity_big_image.* +import java.util.* + + +class BigImageActivity : BaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_big_image + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.black)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + } + + @SuppressLint("SetTextI18n") + override fun initData() { + val index = intent.getIntExtra("index", 0) + val urls = intent.getStringArrayListExtra("images") + if (urls == null || urls.size == 0) { + return + } + pageNumberView.text = "(" + (index + 1) + "/" + urls.size + ")" + imagePagerView.adapter = BigImageAdapter(this, urls) + imagePagerView.currentItem = index + imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrollStateChanged(state: Int) { + + } + + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + pageNumberView.text = "(" + (position + 1) + "/" + urls.size + ")" + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + } + + class BigImageAdapter(private var context: Context, imageList: ArrayList) : + PagerAdapter() { + + private var images: ArrayList = imageList + + override fun getCount(): Int = images.size + + override fun isViewFromObject(view: View, obj: Any): Boolean = view == obj + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val view = LayoutInflater.from(context).inflate( + R.layout.item_big_picture, + container, + false + ) + val photoView: PhotoView = view.findViewById(R.id.photoView) + Glide.with(context).load(images[position]).into(photoView) + photoView.scaleType = ImageView.ScaleType.CENTER_INSIDE + container.addView(view) + //点击大图取消预览 + photoView.setOnClickListener { + PageNavigationManager.finishActivity(BigImageActivity::class.java) + } + return view + } + + override fun destroyItem(container: ViewGroup, position: Int, obj: Any) { + container.removeView(obj as View) + } + } +} diff --git a/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt new file mode 100644 index 0000000..9b29ca3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventDetailActivity.kt @@ -0,0 +1,79 @@ +package com.casic.birmm.inspect.view + +import android.annotation.SuppressLint +import android.view.View +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.adapter.ImageRecycleViewAdapter +import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.combineImagePath +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.gyf.immersionbar.ImmersionBar +import kotlinx.android.synthetic.main.activity_event_detail.* +import kotlinx.android.synthetic.main.include_base_title.* + + +class EventDetailActivity : BaseActivity() { + override fun initLayoutView(): Int = R.layout.activity_event_detail + + override fun setupTopBarLayout() { + PageNavigationManager.addActivity(this) + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "事件详情" + } + + @SuppressLint("SetTextI18n") + override fun initData() { + createTimeView.text = intent.getStringExtra("createTime") + descriptionView.text = intent.getStringExtra("description") + val data = intent.getIntExtra("data", -1) + if (data == -1) { + noImageLayout.visibility = View.GONE + val images = intent.getStringExtra("images") + /** + * images: 2020-12/6528aeb21cff426c91c43a7f8b716d1e.jpg + * images: + * images: 2020-12/c2fd5777fe5d4e09af0bbd6693f5fbf4.jpg,2020-12/7d91abc431d0482da33745bacc111bc4.jpg + * */ + val urls: ArrayList = ArrayList() + if (images == null) { + urls.add("") + } else { + if (images.isEmpty()) { + urls.add("") + } else { + val imageArray = images.split(",") + imageArray.forEach { + urls.add(it.combineImagePath()) + } + } + } + //绑定图片 + val imageAdapter = ImageRecycleViewAdapter(this, urls) + imageRecyclerView.layoutManager = GridLayoutManager(this, 2) + imageRecyclerView.adapter = imageAdapter + imageAdapter.setOnItemClickListener(object : + ImageRecycleViewAdapter.OnItemClickListener { + override fun onClick(position: Int) { + if (urls[position].isEmpty()) { + "图片加载失败,无法查看大图".show(this@EventDetailActivity) + } else { + OtherUtils.showBigImage(this@EventDetailActivity, position, urls) + } + } + }) + } else { + hasImageLayout.visibility = View.GONE + dataView.text = "$data.0" + } + } + + 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/EventQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt new file mode 100644 index 0000000..3d2eb8f --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/EventQueryActivity.kt @@ -0,0 +1,184 @@ +package com.casic.birmm.inspect.view + +import android.content.Intent +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.EventListAdapter +import com.casic.birmm.inspect.base.BaseViewModelActivity +import com.casic.birmm.inspect.extensions.filterString +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil +import com.casic.birmm.inspect.vm.EventQueryViewModel +import com.gyf.immersionbar.ImmersionBar +import com.jzxiang.pickerview.TimePickerDialog +import com.jzxiang.pickerview.data.Type +import kotlinx.android.synthetic.main.activity_query_event.* +import kotlinx.android.synthetic.main.activity_query_inspect.emptyView +import kotlinx.android.synthetic.main.activity_query_inspect.endDateView +import kotlinx.android.synthetic.main.activity_query_inspect.inputTipsView +import kotlinx.android.synthetic.main.activity_query_inspect.refreshLayout +import kotlinx.android.synthetic.main.activity_query_inspect.searchView +import kotlinx.android.synthetic.main.activity_query_inspect.startDateView +import kotlinx.android.synthetic.main.include_base_title.* +import java.lang.ref.WeakReference + +class EventQueryActivity : 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: EventListAdapter + + override fun createViewModelByClass(): Class? = + EventQueryViewModel::class.java + + override fun initLayoutView(): Int = R.layout.activity_query_event + + 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.queryEvent(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() + //查询都从第一页开始查 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, 1) + } + + refreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + viewModel.queryEvent(keywords, startTime, endTime, pageIndex) + } + refreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + viewModel.queryEvent(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) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + refreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(20210712) + } + }) + viewModel.loadState.observe(this, Observer { + "抱歉,无法查询到相关记录".show(this) + }) + } + + private class WeakReferenceHandler(activity: EventQueryActivity) : Handler() { + private val reference: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + val resultActivity = reference.get() + if (msg.what == 20210712) { + if (resultActivity!!.isRefresh || resultActivity.isLoadMore) { + resultActivity.adapter.notifyDataSetChanged() + } else { //首次加载数据 + if (resultActivity.dataBeans.size == 0) { + resultActivity.emptyView!!.show("抱歉,无法查询到相关记录", null) + } else { + resultActivity.emptyView!!.hide() + resultActivity.adapter = + EventListAdapter(resultActivity, resultActivity.dataBeans) + resultActivity.eventRecyclerView!!.layoutManager = + LinearLayoutManager(resultActivity) + resultActivity.eventRecyclerView!!.adapter = resultActivity.adapter + resultActivity.adapter.setOnItemClickListener(object : + EventListAdapter.OnItemClickListener { + override fun onClick(position: Int) { + val intent = Intent(resultActivity, EventDetailActivity::class.java) + val rowsBean = resultActivity.dataBeans[position] + intent.putExtra("createTime", rowsBean.createTime) + intent.putExtra( + "description", + rowsBean.description!!.filterString() + ) + intent.putExtra("data", rowsBean.data) + intent.putExtra("images", rowsBean.images) + resultActivity.startActivity(intent) + } + }) + } + } + } + } + } +} \ 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 016fca4..2e57bec 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.AuthenticationHelper +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.qmuiteam.qmui.util.QMUIDisplayHelper @@ -69,7 +73,7 @@ finish() }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt new file mode 100644 index 0000000..d805b9d --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -0,0 +1,4 @@ +package com.casic.birmm.inspect.view + +class InspectRouteActivity { +} \ 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 index cff683a..d075b96 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -8,8 +8,12 @@ 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.extensions.show import com.casic.birmm.inspect.model.InspectModel -import com.casic.birmm.inspect.utils.* +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.utils.TimeOrDateUtil import com.casic.birmm.inspect.vm.InspectionQueryViewModel import com.gyf.immersionbar.ImmersionBar import com.jzxiang.pickerview.TimePickerDialog @@ -44,7 +48,7 @@ } override fun initData() { - weakReferenceHandler = WeakReferenceHandler(this); + weakReferenceHandler = WeakReferenceHandler(this) viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -86,6 +90,8 @@ //开始搜索 searchView.setOnClickListener { keywords = inputTipsView.text.toString() + //查询都从第一页开始查 + pageIndex = 1 viewModel.queryInspect(keywords, startTime, endTime, pageIndex) } @@ -112,7 +118,7 @@ } isLoadMore -> { if (dataRows?.size == 0) { - ToastHelper.showToast(this, "到底了,别拉了") + "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) refreshLayout.finishLoadMore() @@ -126,7 +132,7 @@ } }) viewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "抱歉,无法查询到相关记录") + "抱歉,无法查询到相关记录".show(this) }) } 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 df4239c..517203f 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 @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.AuthenticateViewModel import com.casic.birmm.inspect.vm.LoginInViewModel @@ -59,7 +60,7 @@ changeLoadStatus(loginState) }) } else { - ToastHelper.showToast(this, it.message!!) + it.message!!.show(this) } }) authenticateViewModel.loadState.observe(this, Observer { @@ -109,11 +110,11 @@ val account = userNameView.text.toString() val userPassword = userPasswordView.text.toString() if (TextUtils.isEmpty(account)) { - ToastHelper.showToast(this, "用户名不能为空") + "用户名不能为空".show(this) return@setOnClickListener } if (TextUtils.isEmpty(userPassword)) { - ToastHelper.showToast(this, "密码不能为空") + "密码不能为空".show(this) return@setOnClickListener } authenticateViewModel.obtainPublicKey() 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 3f49b60..4ef86d3 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,7 +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.* +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.SaveKeyValues +import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar @@ -41,7 +45,7 @@ SaveKeyValues.putValue(Constant.USER_OBJECT, Gson().toJson(it))//保存用户对象 }) userViewModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "获取用户信息失败,请重试") + "获取用户信息失败,请重试".show(this) }) } } @@ -65,7 +69,7 @@ startActivity(Intent(this, InspectionQueryActivity::class.java)) } 1 -> { -// startActivity(Intent(this, EventQueryActivity::class.java)) + startActivity(Intent(this, EventQueryActivity::class.java)) } } }.build().show() @@ -79,7 +83,7 @@ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { return if (keyCode == KeyEvent.KEYCODE_BACK) { if (System.currentTimeMillis() - clickTime > 2000) { - ToastHelper.showToast(this, "再按一次退出程序") + "再按一次退出程序".show(this) clickTime = System.currentTimeMillis() true } else { 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 4039bd3..06f680d 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 @@ -9,6 +9,7 @@ import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R import com.casic.birmm.inspect.base.BaseActivity +import com.casic.birmm.inspect.extensions.show import com.casic.birmm.inspect.model.UserInfoModel import com.casic.birmm.inspect.utils.* import com.casic.birmm.inspect.vm.LoginOutViewModel @@ -54,7 +55,7 @@ leftBackView.setOnClickListener { this.finish() } warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { - ToastHelper.showToast(this, "设备没有震动蜂鸣器,无法打开此开关") + "设备没有震动蜂鸣器,无法打开此开关".show(this) warningSwitch.isChecked = false return@setOnClickListener } @@ -108,11 +109,11 @@ //清除所有Activity PageNavigationManager.finishAllActivity() } else { - ToastHelper.showToast(this@UserSettingsActivity, "操作失败") + "操作失败".show(this@UserSettingsActivity) } }) loginOutModel.loadState.observe(this, Observer { - ToastHelper.showToast(this, "操作失败,请重试") + "操作失败,请重试".show(this) }) }.create().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt index f14f4cb..6cba9ba 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/AuthenticateViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.PublicKeyModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class AuthenticateViewModel : BaseViewModel() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.kt new file mode 100644 index 0000000..7dcf628 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/vm/EventQueryViewModel.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.extensions.launch +import com.casic.birmm.inspect.model.EventModel +import com.casic.birmm.inspect.utils.LoadState +import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager + +class EventQueryViewModel : BaseViewModel() { + val resultModel = MutableLiveData() + + fun queryEvent(keywords: String, startTime: String, endTime: String, pageIndex: Int) = + launch({ + resultModel.value = + RetrofitServiceManager.queryEvent(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/InspectionQueryViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt index 91359a2..4c7c302 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/InspectionQueryViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt index d9bd8ba..15fc791 100644 --- a/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt +++ b/app/src/main/java/com/casic/birmm/inspect/vm/LoginInViewModel.kt @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch import com.casic.birmm.inspect.model.LoginResultModel import com.casic.birmm.inspect.utils.LoadState -import com.casic.birmm.inspect.utils.launch import com.casic.birmm.inspect.utils.retrofit.RetrofitServiceManager class LoginInViewModel : BaseViewModel() { 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 c60862d..345f6bd 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { 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 8cc84f2..a250865 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 @@ -2,9 +2,9 @@ import androidx.lifecycle.MutableLiveData import com.casic.birmm.inspect.base.BaseViewModel +import com.casic.birmm.inspect.extensions.launch 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() { diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cb30ae3..cfa32dc 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -7,7 +7,7 @@ import android.os.Bundle import android.view.WindowManager import com.casic.birmm.inspect.R -import com.casic.birmm.inspect.utils.ToastHelper +import com.casic.birmm.inspect.extensions.show import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.dialog_input.* @@ -53,7 +53,7 @@ dialogConfirmButton.setOnClickListener { val inputValue = dialogInputView.text.toString().trim() if (inputValue.isEmpty()) { - ToastHelper.showToast(ctx!!, "什么都没输入,请重新输入") + "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } listener?.onButtonClick(inputValue) diff --git a/app/src/main/res/anim/activity_in.xml b/app/src/main/res/anim/activity_in.xml new file mode 100644 index 0000000..f2696ba --- /dev/null +++ b/app/src/main/res/anim/activity_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/activity_out.xml b/app/src/main/res/anim/activity_out.xml new file mode 100644 index 0000000..1e424a5 --- /dev/null +++ b/app/src/main/res/anim/activity_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_load_error.xml b/app/src/main/res/drawable/ic_load_error.xml new file mode 100644 index 0000000..dcb0005 --- /dev/null +++ b/app/src/main/res/drawable/ic_load_error.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/layout/activity_big_image.xml b/app/src/main/res/layout/activity_big_image.xml new file mode 100644 index 0000000..8ae4bfc --- /dev/null +++ b/app/src/main/res/layout/activity_big_image.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_event_detail.xml b/app/src/main/res/layout/activity_event_detail.xml new file mode 100644 index 0000000..89dbc1e --- /dev/null +++ b/app/src/main/res/layout/activity_event_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_event.xml b/app/src/main/res/layout/activity_query_event.xml new file mode 100644 index 0000000..109737c --- /dev/null +++ b/app/src/main/res/layout/activity_query_event.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_query_inspect.xml b/app/src/main/res/layout/activity_query_inspect.xml index de77290..945dfb6 100644 --- a/app/src/main/res/layout/activity_query_inspect.xml +++ b/app/src/main/res/layout/activity_query_inspect.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/item_big_picture.xml b/app/src/main/res/layout/item_big_picture.xml new file mode 100644 index 0000000..d90eb44 --- /dev/null +++ b/app/src/main/res/layout/item_big_picture.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_image_gridview.xml b/app/src/main/res/layout/item_image_gridview.xml new file mode 100644 index 0000000..84868e0 --- /dev/null +++ b/app/src/main/res/layout/item_image_gridview.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index e9b1617..92f3cdc 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -6,7 +6,7 @@ #FFFFFF #F9F9F9 - #EFEFEF + #EFEFEF #E5E5E5 #D3D3D3 #C0C0C0 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f88da9d..176b516 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -76,4 +76,14 @@ true true + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..064f301 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file