diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt index e31924a..5065648 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt @@ -12,10 +12,8 @@ import android.os.Vibrator import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.amap.api.maps.AMap @@ -26,6 +24,8 @@ import com.amap.api.maps.model.MyLocationStyle import com.amap.api.maps.model.PolylineOptions import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentMapInspectBinding import com.casic.birmm.inspect.extensions.addAll import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.toDataModel @@ -44,26 +44,13 @@ import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.addInspectionButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.bluetoothButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.currentValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.deviceStatusView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectNameView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectTimeView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.mapView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.maxValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.newEventButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.refreshButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.settingsValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.stopInspectButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* @SuppressLint("MissingPermission") -class HomePageFragment : Fragment(), Handler.Callback { +class HomePageFragment : KotlinBaseFragment(), Handler.Callback { companion object { lateinit var weakReferenceHandler: WeakReferenceHandler @@ -72,7 +59,6 @@ private val kTag = "HomePageFragment" private val blueToothBeans: MutableList = ArrayList()//搜索展示列表 private val latLngs = LinkedList() - private lateinit var homeView: View private lateinit var vibrator: Vibrator private lateinit var aMap: AMap private var newInspectionModel: NewInspectionModel? = null//新建巡检数据结构模型 @@ -82,33 +68,24 @@ private var isGeneratingTask = false private var alarmCount = 0 private var connectedDeviceName = "" + private var isDataCommandOpened = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.single_fragment_map_inspect, container, false) - - setupTopBarLayout() - - initData(savedInstanceState) - - initEvent() - - return homeView + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentMapInspectBinding { + return SingleFragmentMapInspectBinding.inflate(inflater, container, false) } - fun setupTopBarLayout() { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) - homeView.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + binding.statusBarView.requestLayout() } - fun initData(savedInstanceState: Bundle?) { + override fun initDefaultData(savedInstanceState: Bundle?) { vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator weakReferenceHandler = WeakReferenceHandler(this) @@ -120,8 +97,8 @@ "该设备不支持低功耗蓝牙".show(requireContext()) } - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER @@ -164,13 +141,17 @@ //设置按钮状态 if (newInspectionModel == null) { - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true } } - fun initEvent() { - homeView.addInspectionButton.setOnClickListener { + override fun observeRequestState() { + + } + + override fun initEvent() { + binding.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃") .setPositiveButton("开始巡检") @@ -181,8 +162,8 @@ val startTime = currentTimeMillis.timestampToCompleteDate() //设置标题和时间 - homeView.inspectNameView.text = value - homeView.inspectTimeView.text = startTime + binding.inspectNameView.text = value + binding.inspectTimeView.text = startTime newInspectionModel = NewInspectionModel( currentTimeMillis.id(), value, startTime, @@ -192,8 +173,8 @@ ) //按钮状态 - homeView.stopInspectButton.isEnabled = true - homeView.addInspectionButton.isEnabled = false + binding.stopInspectButton.isEnabled = true + binding.addInspectionButton.isEnabled = false } override fun onCancelClick() { @@ -205,7 +186,7 @@ //地图左边三个按钮事件 menuButtonEvent() - homeView.newEventButton.setOnClickListener { + binding.newEventButton.setOnClickListener { if (newInspectionModel == null) { "还未开始巡检,无法新建事件".show(requireContext()) return@setOnClickListener @@ -231,7 +212,7 @@ private fun menuButtonEvent() { //结束巡检 - homeView.stopInspectButton.setOnClickListener { + binding.stopInspectButton.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -252,8 +233,8 @@ //蓝牙按钮 if (isBluetoothOn) { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - homeView.bluetoothButton.setOnClickListener { + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setOnClickListener { if (curConnectState) { AlertControlDialog.Builder() .setContext(requireContext()) @@ -270,10 +251,11 @@ override fun onConfirmClick() { //断开连接 BLEManager.disConnectDevice() - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" - homeView.deviceStatusView.text = "设备编号:未连接" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + isDataCommandOpened = false "设备已断开连接".show(requireContext()) } }).build().show() @@ -300,11 +282,11 @@ } } } else { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) } //重新发送指令按钮 - homeView.refreshButton.setOnClickListener { + binding.refreshButton.setOnClickListener { if (curConnectState) { BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) } else { @@ -317,13 +299,13 @@ when (msg.what) { LocaleConstant.BLUETOOTH_ON -> { "蓝牙已开启".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) isBluetoothOn = true } LocaleConstant.BLUETOOTH_OFF -> { "蓝牙已关闭".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) isBluetoothOn = false } @@ -385,14 +367,22 @@ if (bytes.first() == 51.toByte() && bytes.size >= 14) { //解析deviceCode //[51, 51, 50, 48, 48, 48, 48, 49, 48, 48, 48, 50, 13, 10] - homeView.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" + binding.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, bytes.toDeviceCode()) - BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } else if (bytes.first() == (-86).toByte() && bytes.size == 14) { handleMethaneData(bytes) } else { //如果收到错误数据,就保存设备编号 + binding.deviceStatusView.text = "设备编号: $connectedDeviceName" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, connectedDeviceName) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } } @@ -403,21 +393,22 @@ if (curConnectState) { BLEManager.disConnectDevice() } - homeView.deviceStatusView.text = "设备编号:未连接" - homeView.inspectNameView.text = "" - homeView.inspectTimeView.text = "" - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + binding.inspectNameView.text = "" + binding.inspectTimeView.text = "" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" //按钮状态 - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true //清除缓存 blueToothBeans.clear() latLngs.clear() SaveKeyValues.removeKey(LocaleConstant.DEVICE_CODE) + isDataCommandOpened = false LoadingDialogHub.dismiss() "巡检记录保存成功".show(requireContext()) @@ -571,9 +562,9 @@ * */ private fun handleMethaneData(bytes: ByteArray) { val dataModel = bytes.toDataModel() - homeView.currentValueView.text = dataModel.potency.toString() - homeView.settingsValueView.text = dataModel.alarmValue.toString() - homeView.maxValueView.text = dataModel.maxPotency.toString() + binding.currentValueView.text = dataModel.potency.toString() + binding.settingsValueView.text = dataModel.alarmValue.toString() + binding.maxValueView.text = dataModel.maxPotency.toString() //判断是否需要报警 val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean if (isOpen) { @@ -588,6 +579,10 @@ //如果连续超过10个报警,自动生成报警事件 alarmCount++ if (alarmCount >= 10) { + if (newInspectionModel == null) { + "没有巡检任务,无法自动记录报警".show(requireContext()) + return + } generateAlarmTask(dataModel.maxPotency) } } @@ -627,30 +622,30 @@ override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() val code = SaveKeyValues.getValue(LocaleConstant.DEVICE_CODE, "") as String if (code.isEmpty()) { - homeView.deviceStatusView.text = "设备编号: 未连接" + binding.deviceStatusView.text = "设备编号: 未连接" } else { - homeView.deviceStatusView.text = "设备编号: $code" + binding.deviceStatusView.text = "设备编号: $code" } //设置标题和时间 if (newInspectionModel == null) { return } - homeView.inspectNameView.text = newInspectionModel!!.name - homeView.inspectTimeView.text = newInspectionModel!!.startTime + binding.inspectNameView.text = newInspectionModel!!.name + binding.inspectTimeView.text = newInspectionModel!!.startTime } override fun onPause() { super.onPause() - homeView.mapView.onPause() + binding.mapView.onPause() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - homeView.mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } override fun onDestroyView() { @@ -661,6 +656,6 @@ override fun onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt index e31924a..5065648 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt @@ -12,10 +12,8 @@ import android.os.Vibrator import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.amap.api.maps.AMap @@ -26,6 +24,8 @@ import com.amap.api.maps.model.MyLocationStyle import com.amap.api.maps.model.PolylineOptions import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentMapInspectBinding import com.casic.birmm.inspect.extensions.addAll import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.toDataModel @@ -44,26 +44,13 @@ import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.addInspectionButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.bluetoothButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.currentValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.deviceStatusView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectNameView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectTimeView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.mapView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.maxValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.newEventButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.refreshButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.settingsValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.stopInspectButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* @SuppressLint("MissingPermission") -class HomePageFragment : Fragment(), Handler.Callback { +class HomePageFragment : KotlinBaseFragment(), Handler.Callback { companion object { lateinit var weakReferenceHandler: WeakReferenceHandler @@ -72,7 +59,6 @@ private val kTag = "HomePageFragment" private val blueToothBeans: MutableList = ArrayList()//搜索展示列表 private val latLngs = LinkedList() - private lateinit var homeView: View private lateinit var vibrator: Vibrator private lateinit var aMap: AMap private var newInspectionModel: NewInspectionModel? = null//新建巡检数据结构模型 @@ -82,33 +68,24 @@ private var isGeneratingTask = false private var alarmCount = 0 private var connectedDeviceName = "" + private var isDataCommandOpened = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.single_fragment_map_inspect, container, false) - - setupTopBarLayout() - - initData(savedInstanceState) - - initEvent() - - return homeView + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentMapInspectBinding { + return SingleFragmentMapInspectBinding.inflate(inflater, container, false) } - fun setupTopBarLayout() { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) - homeView.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + binding.statusBarView.requestLayout() } - fun initData(savedInstanceState: Bundle?) { + override fun initDefaultData(savedInstanceState: Bundle?) { vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator weakReferenceHandler = WeakReferenceHandler(this) @@ -120,8 +97,8 @@ "该设备不支持低功耗蓝牙".show(requireContext()) } - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER @@ -164,13 +141,17 @@ //设置按钮状态 if (newInspectionModel == null) { - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true } } - fun initEvent() { - homeView.addInspectionButton.setOnClickListener { + override fun observeRequestState() { + + } + + override fun initEvent() { + binding.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃") .setPositiveButton("开始巡检") @@ -181,8 +162,8 @@ val startTime = currentTimeMillis.timestampToCompleteDate() //设置标题和时间 - homeView.inspectNameView.text = value - homeView.inspectTimeView.text = startTime + binding.inspectNameView.text = value + binding.inspectTimeView.text = startTime newInspectionModel = NewInspectionModel( currentTimeMillis.id(), value, startTime, @@ -192,8 +173,8 @@ ) //按钮状态 - homeView.stopInspectButton.isEnabled = true - homeView.addInspectionButton.isEnabled = false + binding.stopInspectButton.isEnabled = true + binding.addInspectionButton.isEnabled = false } override fun onCancelClick() { @@ -205,7 +186,7 @@ //地图左边三个按钮事件 menuButtonEvent() - homeView.newEventButton.setOnClickListener { + binding.newEventButton.setOnClickListener { if (newInspectionModel == null) { "还未开始巡检,无法新建事件".show(requireContext()) return@setOnClickListener @@ -231,7 +212,7 @@ private fun menuButtonEvent() { //结束巡检 - homeView.stopInspectButton.setOnClickListener { + binding.stopInspectButton.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -252,8 +233,8 @@ //蓝牙按钮 if (isBluetoothOn) { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - homeView.bluetoothButton.setOnClickListener { + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setOnClickListener { if (curConnectState) { AlertControlDialog.Builder() .setContext(requireContext()) @@ -270,10 +251,11 @@ override fun onConfirmClick() { //断开连接 BLEManager.disConnectDevice() - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" - homeView.deviceStatusView.text = "设备编号:未连接" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + isDataCommandOpened = false "设备已断开连接".show(requireContext()) } }).build().show() @@ -300,11 +282,11 @@ } } } else { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) } //重新发送指令按钮 - homeView.refreshButton.setOnClickListener { + binding.refreshButton.setOnClickListener { if (curConnectState) { BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) } else { @@ -317,13 +299,13 @@ when (msg.what) { LocaleConstant.BLUETOOTH_ON -> { "蓝牙已开启".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) isBluetoothOn = true } LocaleConstant.BLUETOOTH_OFF -> { "蓝牙已关闭".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) isBluetoothOn = false } @@ -385,14 +367,22 @@ if (bytes.first() == 51.toByte() && bytes.size >= 14) { //解析deviceCode //[51, 51, 50, 48, 48, 48, 48, 49, 48, 48, 48, 50, 13, 10] - homeView.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" + binding.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, bytes.toDeviceCode()) - BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } else if (bytes.first() == (-86).toByte() && bytes.size == 14) { handleMethaneData(bytes) } else { //如果收到错误数据,就保存设备编号 + binding.deviceStatusView.text = "设备编号: $connectedDeviceName" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, connectedDeviceName) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } } @@ -403,21 +393,22 @@ if (curConnectState) { BLEManager.disConnectDevice() } - homeView.deviceStatusView.text = "设备编号:未连接" - homeView.inspectNameView.text = "" - homeView.inspectTimeView.text = "" - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + binding.inspectNameView.text = "" + binding.inspectTimeView.text = "" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" //按钮状态 - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true //清除缓存 blueToothBeans.clear() latLngs.clear() SaveKeyValues.removeKey(LocaleConstant.DEVICE_CODE) + isDataCommandOpened = false LoadingDialogHub.dismiss() "巡检记录保存成功".show(requireContext()) @@ -571,9 +562,9 @@ * */ private fun handleMethaneData(bytes: ByteArray) { val dataModel = bytes.toDataModel() - homeView.currentValueView.text = dataModel.potency.toString() - homeView.settingsValueView.text = dataModel.alarmValue.toString() - homeView.maxValueView.text = dataModel.maxPotency.toString() + binding.currentValueView.text = dataModel.potency.toString() + binding.settingsValueView.text = dataModel.alarmValue.toString() + binding.maxValueView.text = dataModel.maxPotency.toString() //判断是否需要报警 val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean if (isOpen) { @@ -588,6 +579,10 @@ //如果连续超过10个报警,自动生成报警事件 alarmCount++ if (alarmCount >= 10) { + if (newInspectionModel == null) { + "没有巡检任务,无法自动记录报警".show(requireContext()) + return + } generateAlarmTask(dataModel.maxPotency) } } @@ -627,30 +622,30 @@ override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() val code = SaveKeyValues.getValue(LocaleConstant.DEVICE_CODE, "") as String if (code.isEmpty()) { - homeView.deviceStatusView.text = "设备编号: 未连接" + binding.deviceStatusView.text = "设备编号: 未连接" } else { - homeView.deviceStatusView.text = "设备编号: $code" + binding.deviceStatusView.text = "设备编号: $code" } //设置标题和时间 if (newInspectionModel == null) { return } - homeView.inspectNameView.text = newInspectionModel!!.name - homeView.inspectTimeView.text = newInspectionModel!!.startTime + binding.inspectNameView.text = newInspectionModel!!.name + binding.inspectTimeView.text = newInspectionModel!!.startTime } override fun onPause() { super.onPause() - homeView.mapView.onPause() + binding.mapView.onPause() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - homeView.mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } override fun onDestroyView() { @@ -661,6 +656,6 @@ override fun onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 3590faa..12137d7 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -4,13 +4,13 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.TaskEventLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryEventBinding import com.casic.birmm.inspect.single.view.EventDetailActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -19,15 +19,12 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.WeakReferenceHandler -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_event.view.eventRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : Fragment(), Handler.Callback { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -40,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081101) } else if (msg.what == 2023081101) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val eventListAdapter = object : NormalRecyclerAdapter( R.layout.item_event_rv_l, dataBeans ) { @@ -69,7 +66,7 @@ .setText(R.id.inspectDateView, "时间:${item.createTime}") } } - v.eventRecyclerView.adapter = eventListAdapter + binding.eventRecyclerView.adapter = eventListAdapter eventListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: TaskEventLocalBean) { @@ -81,16 +78,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_event, container, false) + container: ViewGroup? + ): SingleFragmentQueryEventBinding { + return SingleFragmentQueryEventBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt index e31924a..5065648 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt @@ -12,10 +12,8 @@ import android.os.Vibrator import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.amap.api.maps.AMap @@ -26,6 +24,8 @@ import com.amap.api.maps.model.MyLocationStyle import com.amap.api.maps.model.PolylineOptions import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentMapInspectBinding import com.casic.birmm.inspect.extensions.addAll import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.toDataModel @@ -44,26 +44,13 @@ import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.addInspectionButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.bluetoothButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.currentValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.deviceStatusView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectNameView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectTimeView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.mapView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.maxValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.newEventButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.refreshButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.settingsValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.stopInspectButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* @SuppressLint("MissingPermission") -class HomePageFragment : Fragment(), Handler.Callback { +class HomePageFragment : KotlinBaseFragment(), Handler.Callback { companion object { lateinit var weakReferenceHandler: WeakReferenceHandler @@ -72,7 +59,6 @@ private val kTag = "HomePageFragment" private val blueToothBeans: MutableList = ArrayList()//搜索展示列表 private val latLngs = LinkedList() - private lateinit var homeView: View private lateinit var vibrator: Vibrator private lateinit var aMap: AMap private var newInspectionModel: NewInspectionModel? = null//新建巡检数据结构模型 @@ -82,33 +68,24 @@ private var isGeneratingTask = false private var alarmCount = 0 private var connectedDeviceName = "" + private var isDataCommandOpened = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.single_fragment_map_inspect, container, false) - - setupTopBarLayout() - - initData(savedInstanceState) - - initEvent() - - return homeView + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentMapInspectBinding { + return SingleFragmentMapInspectBinding.inflate(inflater, container, false) } - fun setupTopBarLayout() { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) - homeView.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + binding.statusBarView.requestLayout() } - fun initData(savedInstanceState: Bundle?) { + override fun initDefaultData(savedInstanceState: Bundle?) { vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator weakReferenceHandler = WeakReferenceHandler(this) @@ -120,8 +97,8 @@ "该设备不支持低功耗蓝牙".show(requireContext()) } - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER @@ -164,13 +141,17 @@ //设置按钮状态 if (newInspectionModel == null) { - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true } } - fun initEvent() { - homeView.addInspectionButton.setOnClickListener { + override fun observeRequestState() { + + } + + override fun initEvent() { + binding.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃") .setPositiveButton("开始巡检") @@ -181,8 +162,8 @@ val startTime = currentTimeMillis.timestampToCompleteDate() //设置标题和时间 - homeView.inspectNameView.text = value - homeView.inspectTimeView.text = startTime + binding.inspectNameView.text = value + binding.inspectTimeView.text = startTime newInspectionModel = NewInspectionModel( currentTimeMillis.id(), value, startTime, @@ -192,8 +173,8 @@ ) //按钮状态 - homeView.stopInspectButton.isEnabled = true - homeView.addInspectionButton.isEnabled = false + binding.stopInspectButton.isEnabled = true + binding.addInspectionButton.isEnabled = false } override fun onCancelClick() { @@ -205,7 +186,7 @@ //地图左边三个按钮事件 menuButtonEvent() - homeView.newEventButton.setOnClickListener { + binding.newEventButton.setOnClickListener { if (newInspectionModel == null) { "还未开始巡检,无法新建事件".show(requireContext()) return@setOnClickListener @@ -231,7 +212,7 @@ private fun menuButtonEvent() { //结束巡检 - homeView.stopInspectButton.setOnClickListener { + binding.stopInspectButton.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -252,8 +233,8 @@ //蓝牙按钮 if (isBluetoothOn) { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - homeView.bluetoothButton.setOnClickListener { + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setOnClickListener { if (curConnectState) { AlertControlDialog.Builder() .setContext(requireContext()) @@ -270,10 +251,11 @@ override fun onConfirmClick() { //断开连接 BLEManager.disConnectDevice() - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" - homeView.deviceStatusView.text = "设备编号:未连接" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + isDataCommandOpened = false "设备已断开连接".show(requireContext()) } }).build().show() @@ -300,11 +282,11 @@ } } } else { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) } //重新发送指令按钮 - homeView.refreshButton.setOnClickListener { + binding.refreshButton.setOnClickListener { if (curConnectState) { BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) } else { @@ -317,13 +299,13 @@ when (msg.what) { LocaleConstant.BLUETOOTH_ON -> { "蓝牙已开启".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) isBluetoothOn = true } LocaleConstant.BLUETOOTH_OFF -> { "蓝牙已关闭".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) isBluetoothOn = false } @@ -385,14 +367,22 @@ if (bytes.first() == 51.toByte() && bytes.size >= 14) { //解析deviceCode //[51, 51, 50, 48, 48, 48, 48, 49, 48, 48, 48, 50, 13, 10] - homeView.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" + binding.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, bytes.toDeviceCode()) - BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } else if (bytes.first() == (-86).toByte() && bytes.size == 14) { handleMethaneData(bytes) } else { //如果收到错误数据,就保存设备编号 + binding.deviceStatusView.text = "设备编号: $connectedDeviceName" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, connectedDeviceName) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } } @@ -403,21 +393,22 @@ if (curConnectState) { BLEManager.disConnectDevice() } - homeView.deviceStatusView.text = "设备编号:未连接" - homeView.inspectNameView.text = "" - homeView.inspectTimeView.text = "" - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + binding.inspectNameView.text = "" + binding.inspectTimeView.text = "" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" //按钮状态 - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true //清除缓存 blueToothBeans.clear() latLngs.clear() SaveKeyValues.removeKey(LocaleConstant.DEVICE_CODE) + isDataCommandOpened = false LoadingDialogHub.dismiss() "巡检记录保存成功".show(requireContext()) @@ -571,9 +562,9 @@ * */ private fun handleMethaneData(bytes: ByteArray) { val dataModel = bytes.toDataModel() - homeView.currentValueView.text = dataModel.potency.toString() - homeView.settingsValueView.text = dataModel.alarmValue.toString() - homeView.maxValueView.text = dataModel.maxPotency.toString() + binding.currentValueView.text = dataModel.potency.toString() + binding.settingsValueView.text = dataModel.alarmValue.toString() + binding.maxValueView.text = dataModel.maxPotency.toString() //判断是否需要报警 val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean if (isOpen) { @@ -588,6 +579,10 @@ //如果连续超过10个报警,自动生成报警事件 alarmCount++ if (alarmCount >= 10) { + if (newInspectionModel == null) { + "没有巡检任务,无法自动记录报警".show(requireContext()) + return + } generateAlarmTask(dataModel.maxPotency) } } @@ -627,30 +622,30 @@ override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() val code = SaveKeyValues.getValue(LocaleConstant.DEVICE_CODE, "") as String if (code.isEmpty()) { - homeView.deviceStatusView.text = "设备编号: 未连接" + binding.deviceStatusView.text = "设备编号: 未连接" } else { - homeView.deviceStatusView.text = "设备编号: $code" + binding.deviceStatusView.text = "设备编号: $code" } //设置标题和时间 if (newInspectionModel == null) { return } - homeView.inspectNameView.text = newInspectionModel!!.name - homeView.inspectTimeView.text = newInspectionModel!!.startTime + binding.inspectNameView.text = newInspectionModel!!.name + binding.inspectTimeView.text = newInspectionModel!!.startTime } override fun onPause() { super.onPause() - homeView.mapView.onPause() + binding.mapView.onPause() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - homeView.mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } override fun onDestroyView() { @@ -661,6 +656,6 @@ override fun onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 3590faa..12137d7 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -4,13 +4,13 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.TaskEventLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryEventBinding import com.casic.birmm.inspect.single.view.EventDetailActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -19,15 +19,12 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.WeakReferenceHandler -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_event.view.eventRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : Fragment(), Handler.Callback { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -40,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081101) } else if (msg.what == 2023081101) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val eventListAdapter = object : NormalRecyclerAdapter( R.layout.item_event_rv_l, dataBeans ) { @@ -69,7 +66,7 @@ .setText(R.id.inspectDateView, "时间:${item.createTime}") } } - v.eventRecyclerView.adapter = eventListAdapter + binding.eventRecyclerView.adapter = eventListAdapter eventListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: TaskEventLocalBean) { @@ -81,16 +78,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_event, container, false) + container: ViewGroup? + ): SingleFragmentQueryEventBinding { + return SingleFragmentQueryEventBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index 204da7d..8b7ea28 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -4,12 +4,12 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.InspectionLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryInspectBinding import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -18,15 +18,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_inspect.view.inspectRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryInspectionFragment : Fragment(), Handler.Callback { +class QueryInspectionFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -39,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081201) } else if (msg.what == 2023081201) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val inspectListAdapter = object : NormalRecyclerAdapter( R.layout.item_inspect_rv_l, dataBeans ) { @@ -86,7 +84,7 @@ } } } - v.inspectRecyclerView.adapter = inspectListAdapter + binding.inspectRecyclerView.adapter = inspectListAdapter inspectListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: InspectionLocalBean) { @@ -98,16 +96,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_inspect, container, false) + container: ViewGroup? + ): SingleFragmentQueryInspectBinding { + return SingleFragmentQueryInspectBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt index e31924a..5065648 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt @@ -12,10 +12,8 @@ import android.os.Vibrator import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.amap.api.maps.AMap @@ -26,6 +24,8 @@ import com.amap.api.maps.model.MyLocationStyle import com.amap.api.maps.model.PolylineOptions import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentMapInspectBinding import com.casic.birmm.inspect.extensions.addAll import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.toDataModel @@ -44,26 +44,13 @@ import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.addInspectionButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.bluetoothButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.currentValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.deviceStatusView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectNameView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectTimeView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.mapView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.maxValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.newEventButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.refreshButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.settingsValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.stopInspectButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* @SuppressLint("MissingPermission") -class HomePageFragment : Fragment(), Handler.Callback { +class HomePageFragment : KotlinBaseFragment(), Handler.Callback { companion object { lateinit var weakReferenceHandler: WeakReferenceHandler @@ -72,7 +59,6 @@ private val kTag = "HomePageFragment" private val blueToothBeans: MutableList = ArrayList()//搜索展示列表 private val latLngs = LinkedList() - private lateinit var homeView: View private lateinit var vibrator: Vibrator private lateinit var aMap: AMap private var newInspectionModel: NewInspectionModel? = null//新建巡检数据结构模型 @@ -82,33 +68,24 @@ private var isGeneratingTask = false private var alarmCount = 0 private var connectedDeviceName = "" + private var isDataCommandOpened = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.single_fragment_map_inspect, container, false) - - setupTopBarLayout() - - initData(savedInstanceState) - - initEvent() - - return homeView + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentMapInspectBinding { + return SingleFragmentMapInspectBinding.inflate(inflater, container, false) } - fun setupTopBarLayout() { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) - homeView.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + binding.statusBarView.requestLayout() } - fun initData(savedInstanceState: Bundle?) { + override fun initDefaultData(savedInstanceState: Bundle?) { vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator weakReferenceHandler = WeakReferenceHandler(this) @@ -120,8 +97,8 @@ "该设备不支持低功耗蓝牙".show(requireContext()) } - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER @@ -164,13 +141,17 @@ //设置按钮状态 if (newInspectionModel == null) { - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true } } - fun initEvent() { - homeView.addInspectionButton.setOnClickListener { + override fun observeRequestState() { + + } + + override fun initEvent() { + binding.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃") .setPositiveButton("开始巡检") @@ -181,8 +162,8 @@ val startTime = currentTimeMillis.timestampToCompleteDate() //设置标题和时间 - homeView.inspectNameView.text = value - homeView.inspectTimeView.text = startTime + binding.inspectNameView.text = value + binding.inspectTimeView.text = startTime newInspectionModel = NewInspectionModel( currentTimeMillis.id(), value, startTime, @@ -192,8 +173,8 @@ ) //按钮状态 - homeView.stopInspectButton.isEnabled = true - homeView.addInspectionButton.isEnabled = false + binding.stopInspectButton.isEnabled = true + binding.addInspectionButton.isEnabled = false } override fun onCancelClick() { @@ -205,7 +186,7 @@ //地图左边三个按钮事件 menuButtonEvent() - homeView.newEventButton.setOnClickListener { + binding.newEventButton.setOnClickListener { if (newInspectionModel == null) { "还未开始巡检,无法新建事件".show(requireContext()) return@setOnClickListener @@ -231,7 +212,7 @@ private fun menuButtonEvent() { //结束巡检 - homeView.stopInspectButton.setOnClickListener { + binding.stopInspectButton.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -252,8 +233,8 @@ //蓝牙按钮 if (isBluetoothOn) { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - homeView.bluetoothButton.setOnClickListener { + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setOnClickListener { if (curConnectState) { AlertControlDialog.Builder() .setContext(requireContext()) @@ -270,10 +251,11 @@ override fun onConfirmClick() { //断开连接 BLEManager.disConnectDevice() - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" - homeView.deviceStatusView.text = "设备编号:未连接" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + isDataCommandOpened = false "设备已断开连接".show(requireContext()) } }).build().show() @@ -300,11 +282,11 @@ } } } else { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) } //重新发送指令按钮 - homeView.refreshButton.setOnClickListener { + binding.refreshButton.setOnClickListener { if (curConnectState) { BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) } else { @@ -317,13 +299,13 @@ when (msg.what) { LocaleConstant.BLUETOOTH_ON -> { "蓝牙已开启".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) isBluetoothOn = true } LocaleConstant.BLUETOOTH_OFF -> { "蓝牙已关闭".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) isBluetoothOn = false } @@ -385,14 +367,22 @@ if (bytes.first() == 51.toByte() && bytes.size >= 14) { //解析deviceCode //[51, 51, 50, 48, 48, 48, 48, 49, 48, 48, 48, 50, 13, 10] - homeView.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" + binding.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, bytes.toDeviceCode()) - BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } else if (bytes.first() == (-86).toByte() && bytes.size == 14) { handleMethaneData(bytes) } else { //如果收到错误数据,就保存设备编号 + binding.deviceStatusView.text = "设备编号: $connectedDeviceName" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, connectedDeviceName) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } } @@ -403,21 +393,22 @@ if (curConnectState) { BLEManager.disConnectDevice() } - homeView.deviceStatusView.text = "设备编号:未连接" - homeView.inspectNameView.text = "" - homeView.inspectTimeView.text = "" - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + binding.inspectNameView.text = "" + binding.inspectTimeView.text = "" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" //按钮状态 - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true //清除缓存 blueToothBeans.clear() latLngs.clear() SaveKeyValues.removeKey(LocaleConstant.DEVICE_CODE) + isDataCommandOpened = false LoadingDialogHub.dismiss() "巡检记录保存成功".show(requireContext()) @@ -571,9 +562,9 @@ * */ private fun handleMethaneData(bytes: ByteArray) { val dataModel = bytes.toDataModel() - homeView.currentValueView.text = dataModel.potency.toString() - homeView.settingsValueView.text = dataModel.alarmValue.toString() - homeView.maxValueView.text = dataModel.maxPotency.toString() + binding.currentValueView.text = dataModel.potency.toString() + binding.settingsValueView.text = dataModel.alarmValue.toString() + binding.maxValueView.text = dataModel.maxPotency.toString() //判断是否需要报警 val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean if (isOpen) { @@ -588,6 +579,10 @@ //如果连续超过10个报警,自动生成报警事件 alarmCount++ if (alarmCount >= 10) { + if (newInspectionModel == null) { + "没有巡检任务,无法自动记录报警".show(requireContext()) + return + } generateAlarmTask(dataModel.maxPotency) } } @@ -627,30 +622,30 @@ override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() val code = SaveKeyValues.getValue(LocaleConstant.DEVICE_CODE, "") as String if (code.isEmpty()) { - homeView.deviceStatusView.text = "设备编号: 未连接" + binding.deviceStatusView.text = "设备编号: 未连接" } else { - homeView.deviceStatusView.text = "设备编号: $code" + binding.deviceStatusView.text = "设备编号: $code" } //设置标题和时间 if (newInspectionModel == null) { return } - homeView.inspectNameView.text = newInspectionModel!!.name - homeView.inspectTimeView.text = newInspectionModel!!.startTime + binding.inspectNameView.text = newInspectionModel!!.name + binding.inspectTimeView.text = newInspectionModel!!.startTime } override fun onPause() { super.onPause() - homeView.mapView.onPause() + binding.mapView.onPause() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - homeView.mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } override fun onDestroyView() { @@ -661,6 +656,6 @@ override fun onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 3590faa..12137d7 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -4,13 +4,13 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.TaskEventLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryEventBinding import com.casic.birmm.inspect.single.view.EventDetailActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -19,15 +19,12 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.WeakReferenceHandler -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_event.view.eventRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : Fragment(), Handler.Callback { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -40,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081101) } else if (msg.what == 2023081101) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val eventListAdapter = object : NormalRecyclerAdapter( R.layout.item_event_rv_l, dataBeans ) { @@ -69,7 +66,7 @@ .setText(R.id.inspectDateView, "时间:${item.createTime}") } } - v.eventRecyclerView.adapter = eventListAdapter + binding.eventRecyclerView.adapter = eventListAdapter eventListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: TaskEventLocalBean) { @@ -81,16 +78,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_event, container, false) + container: ViewGroup? + ): SingleFragmentQueryEventBinding { + return SingleFragmentQueryEventBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index 204da7d..8b7ea28 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -4,12 +4,12 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.InspectionLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryInspectBinding import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -18,15 +18,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_inspect.view.inspectRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryInspectionFragment : Fragment(), Handler.Callback { +class QueryInspectionFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -39,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081201) } else if (msg.what == 2023081201) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val inspectListAdapter = object : NormalRecyclerAdapter( R.layout.item_inspect_rv_l, dataBeans ) { @@ -86,7 +84,7 @@ } } } - v.inspectRecyclerView.adapter = inspectListAdapter + binding.inspectRecyclerView.adapter = inspectListAdapter inspectListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: InspectionLocalBean) { @@ -98,16 +96,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_inspect, container, false) + container: ViewGroup? + ): SingleFragmentQueryInspectBinding { + return SingleFragmentQueryInspectBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt index a24a507..0a82d40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt @@ -6,14 +6,14 @@ import android.os.Bundle import android.os.Vibrator import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentUserSettingsBinding import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper import com.casic.birmm.inspect.view.HelpCenterActivity @@ -24,60 +24,49 @@ import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.appVersionView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.autoRecordSwitch -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.backLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.exitLoginView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.helpLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.updateLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.userAvatarView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.warningSwitch -class SettingPageFragment : Fragment() { +class SettingPageFragment : KotlinBaseFragment() { - private lateinit var v: View private lateinit var vibrator: Vibrator - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_user_settings, container, false) - - //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = requireContext().getStatusBarHeight() - val params = v.statusBarView.layoutParams as LinearLayout.LayoutParams - params.height = statusBarHeight - v.statusBarView.requestLayout() - - initData() - - initEvent() - - return v + container: ViewGroup? + ): SingleFragmentUserSettingsBinding { + return SingleFragmentUserSettingsBinding.inflate(inflater, container, false) } - fun initData() { + override fun setupTopBarLayout() { + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = requireContext().getStatusBarHeight() + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + binding.statusBarView.requestLayout() + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { Glide.with(requireContext()) .load(R.mipmap.ic_launcher) .apply(RequestOptions.circleCropTransform()) - .into(v.userAvatarView) + .into(binding.userAvatarView) val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean - v.warningSwitch.isChecked = isOpen + binding.warningSwitch.isChecked = isOpen val isRecord = SaveKeyValues.getValue(LocaleConstant.SINGLE_AUTO_RECORD, false) as Boolean - v.autoRecordSwitch.isChecked = isRecord + binding.autoRecordSwitch.isChecked = isRecord - v.appVersionView.text = BuildConfig.VERSION_NAME + binding.appVersionView.text = BuildConfig.VERSION_NAME //震动 vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } - fun initEvent() { - v.exitLoginView.setOnClickListener { + override fun initEvent() { + binding.exitLoginView.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -98,14 +87,14 @@ }).build().show() } - v.warningSwitch.setOnClickListener { + binding.warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) - v.warningSwitch.isChecked = false + binding.warningSwitch.isChecked = false return@setOnClickListener } } - v.warningSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.SINGLE_OPEN_WARNING, true) SoundPoolHelper.playSound(requireContext(), R.raw.alarm) @@ -115,7 +104,7 @@ SaveKeyValues.putValue(LocaleConstant.SINGLE_OPEN_WARNING, false) } } - v.autoRecordSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.autoRecordSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.SINGLE_AUTO_RECORD, true) } else { @@ -123,15 +112,15 @@ } } - v.helpLayout.setOnClickListener { + binding.helpLayout.setOnClickListener { requireContext().navigatePageTo() } - v.updateLayout.setOnClickListener { + binding.updateLayout.setOnClickListener { "已是最新版本,无需更新".show(requireContext()) } - v.backLayout.setOnClickListener { + binding.backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") diff --git a/app/build.gradle b/app/build.gradle index c305d3d..256bb73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,8 +21,8 @@ applicationId "com.casic.birmm.inspect" minSdkVersion 23 targetSdkVersion 33 - versionCode 1002 - versionName "1.0.0.2" + versionCode 1003 + versionName "1.0.0.3" } buildTypes { diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt new file mode 100644 index 0000000..215028a --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseActivity.kt @@ -0,0 +1,45 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseActivity : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt index e31924a..5065648 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt @@ -12,10 +12,8 @@ import android.os.Vibrator import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.amap.api.maps.AMap @@ -26,6 +24,8 @@ import com.amap.api.maps.model.MyLocationStyle import com.amap.api.maps.model.PolylineOptions import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentMapInspectBinding import com.casic.birmm.inspect.extensions.addAll import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.toDataModel @@ -44,26 +44,13 @@ import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.addInspectionButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.bluetoothButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.currentValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.deviceStatusView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectNameView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectTimeView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.mapView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.maxValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.newEventButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.refreshButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.settingsValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.stopInspectButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* @SuppressLint("MissingPermission") -class HomePageFragment : Fragment(), Handler.Callback { +class HomePageFragment : KotlinBaseFragment(), Handler.Callback { companion object { lateinit var weakReferenceHandler: WeakReferenceHandler @@ -72,7 +59,6 @@ private val kTag = "HomePageFragment" private val blueToothBeans: MutableList = ArrayList()//搜索展示列表 private val latLngs = LinkedList() - private lateinit var homeView: View private lateinit var vibrator: Vibrator private lateinit var aMap: AMap private var newInspectionModel: NewInspectionModel? = null//新建巡检数据结构模型 @@ -82,33 +68,24 @@ private var isGeneratingTask = false private var alarmCount = 0 private var connectedDeviceName = "" + private var isDataCommandOpened = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.single_fragment_map_inspect, container, false) - - setupTopBarLayout() - - initData(savedInstanceState) - - initEvent() - - return homeView + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentMapInspectBinding { + return SingleFragmentMapInspectBinding.inflate(inflater, container, false) } - fun setupTopBarLayout() { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) - homeView.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + binding.statusBarView.requestLayout() } - fun initData(savedInstanceState: Bundle?) { + override fun initDefaultData(savedInstanceState: Bundle?) { vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator weakReferenceHandler = WeakReferenceHandler(this) @@ -120,8 +97,8 @@ "该设备不支持低功耗蓝牙".show(requireContext()) } - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER @@ -164,13 +141,17 @@ //设置按钮状态 if (newInspectionModel == null) { - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true } } - fun initEvent() { - homeView.addInspectionButton.setOnClickListener { + override fun observeRequestState() { + + } + + override fun initEvent() { + binding.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃") .setPositiveButton("开始巡检") @@ -181,8 +162,8 @@ val startTime = currentTimeMillis.timestampToCompleteDate() //设置标题和时间 - homeView.inspectNameView.text = value - homeView.inspectTimeView.text = startTime + binding.inspectNameView.text = value + binding.inspectTimeView.text = startTime newInspectionModel = NewInspectionModel( currentTimeMillis.id(), value, startTime, @@ -192,8 +173,8 @@ ) //按钮状态 - homeView.stopInspectButton.isEnabled = true - homeView.addInspectionButton.isEnabled = false + binding.stopInspectButton.isEnabled = true + binding.addInspectionButton.isEnabled = false } override fun onCancelClick() { @@ -205,7 +186,7 @@ //地图左边三个按钮事件 menuButtonEvent() - homeView.newEventButton.setOnClickListener { + binding.newEventButton.setOnClickListener { if (newInspectionModel == null) { "还未开始巡检,无法新建事件".show(requireContext()) return@setOnClickListener @@ -231,7 +212,7 @@ private fun menuButtonEvent() { //结束巡检 - homeView.stopInspectButton.setOnClickListener { + binding.stopInspectButton.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -252,8 +233,8 @@ //蓝牙按钮 if (isBluetoothOn) { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - homeView.bluetoothButton.setOnClickListener { + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setOnClickListener { if (curConnectState) { AlertControlDialog.Builder() .setContext(requireContext()) @@ -270,10 +251,11 @@ override fun onConfirmClick() { //断开连接 BLEManager.disConnectDevice() - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" - homeView.deviceStatusView.text = "设备编号:未连接" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + isDataCommandOpened = false "设备已断开连接".show(requireContext()) } }).build().show() @@ -300,11 +282,11 @@ } } } else { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) } //重新发送指令按钮 - homeView.refreshButton.setOnClickListener { + binding.refreshButton.setOnClickListener { if (curConnectState) { BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) } else { @@ -317,13 +299,13 @@ when (msg.what) { LocaleConstant.BLUETOOTH_ON -> { "蓝牙已开启".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) isBluetoothOn = true } LocaleConstant.BLUETOOTH_OFF -> { "蓝牙已关闭".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) isBluetoothOn = false } @@ -385,14 +367,22 @@ if (bytes.first() == 51.toByte() && bytes.size >= 14) { //解析deviceCode //[51, 51, 50, 48, 48, 48, 48, 49, 48, 48, 48, 50, 13, 10] - homeView.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" + binding.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, bytes.toDeviceCode()) - BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } else if (bytes.first() == (-86).toByte() && bytes.size == 14) { handleMethaneData(bytes) } else { //如果收到错误数据,就保存设备编号 + binding.deviceStatusView.text = "设备编号: $connectedDeviceName" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, connectedDeviceName) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } } @@ -403,21 +393,22 @@ if (curConnectState) { BLEManager.disConnectDevice() } - homeView.deviceStatusView.text = "设备编号:未连接" - homeView.inspectNameView.text = "" - homeView.inspectTimeView.text = "" - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + binding.inspectNameView.text = "" + binding.inspectTimeView.text = "" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" //按钮状态 - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true //清除缓存 blueToothBeans.clear() latLngs.clear() SaveKeyValues.removeKey(LocaleConstant.DEVICE_CODE) + isDataCommandOpened = false LoadingDialogHub.dismiss() "巡检记录保存成功".show(requireContext()) @@ -571,9 +562,9 @@ * */ private fun handleMethaneData(bytes: ByteArray) { val dataModel = bytes.toDataModel() - homeView.currentValueView.text = dataModel.potency.toString() - homeView.settingsValueView.text = dataModel.alarmValue.toString() - homeView.maxValueView.text = dataModel.maxPotency.toString() + binding.currentValueView.text = dataModel.potency.toString() + binding.settingsValueView.text = dataModel.alarmValue.toString() + binding.maxValueView.text = dataModel.maxPotency.toString() //判断是否需要报警 val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean if (isOpen) { @@ -588,6 +579,10 @@ //如果连续超过10个报警,自动生成报警事件 alarmCount++ if (alarmCount >= 10) { + if (newInspectionModel == null) { + "没有巡检任务,无法自动记录报警".show(requireContext()) + return + } generateAlarmTask(dataModel.maxPotency) } } @@ -627,30 +622,30 @@ override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() val code = SaveKeyValues.getValue(LocaleConstant.DEVICE_CODE, "") as String if (code.isEmpty()) { - homeView.deviceStatusView.text = "设备编号: 未连接" + binding.deviceStatusView.text = "设备编号: 未连接" } else { - homeView.deviceStatusView.text = "设备编号: $code" + binding.deviceStatusView.text = "设备编号: $code" } //设置标题和时间 if (newInspectionModel == null) { return } - homeView.inspectNameView.text = newInspectionModel!!.name - homeView.inspectTimeView.text = newInspectionModel!!.startTime + binding.inspectNameView.text = newInspectionModel!!.name + binding.inspectTimeView.text = newInspectionModel!!.startTime } override fun onPause() { super.onPause() - homeView.mapView.onPause() + binding.mapView.onPause() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - homeView.mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } override fun onDestroyView() { @@ -661,6 +656,6 @@ override fun onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 3590faa..12137d7 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -4,13 +4,13 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.TaskEventLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryEventBinding import com.casic.birmm.inspect.single.view.EventDetailActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -19,15 +19,12 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.WeakReferenceHandler -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_event.view.eventRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : Fragment(), Handler.Callback { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -40,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081101) } else if (msg.what == 2023081101) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val eventListAdapter = object : NormalRecyclerAdapter( R.layout.item_event_rv_l, dataBeans ) { @@ -69,7 +66,7 @@ .setText(R.id.inspectDateView, "时间:${item.createTime}") } } - v.eventRecyclerView.adapter = eventListAdapter + binding.eventRecyclerView.adapter = eventListAdapter eventListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: TaskEventLocalBean) { @@ -81,16 +78,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_event, container, false) + container: ViewGroup? + ): SingleFragmentQueryEventBinding { + return SingleFragmentQueryEventBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index 204da7d..8b7ea28 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -4,12 +4,12 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.InspectionLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryInspectBinding import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -18,15 +18,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_inspect.view.inspectRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryInspectionFragment : Fragment(), Handler.Callback { +class QueryInspectionFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -39,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081201) } else if (msg.what == 2023081201) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val inspectListAdapter = object : NormalRecyclerAdapter( R.layout.item_inspect_rv_l, dataBeans ) { @@ -86,7 +84,7 @@ } } } - v.inspectRecyclerView.adapter = inspectListAdapter + binding.inspectRecyclerView.adapter = inspectListAdapter inspectListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: InspectionLocalBean) { @@ -98,16 +96,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_inspect, container, false) + container: ViewGroup? + ): SingleFragmentQueryInspectBinding { + return SingleFragmentQueryInspectBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt index a24a507..0a82d40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt @@ -6,14 +6,14 @@ import android.os.Bundle import android.os.Vibrator import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentUserSettingsBinding import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper import com.casic.birmm.inspect.view.HelpCenterActivity @@ -24,60 +24,49 @@ import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.appVersionView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.autoRecordSwitch -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.backLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.exitLoginView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.helpLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.updateLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.userAvatarView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.warningSwitch -class SettingPageFragment : Fragment() { +class SettingPageFragment : KotlinBaseFragment() { - private lateinit var v: View private lateinit var vibrator: Vibrator - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_user_settings, container, false) - - //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = requireContext().getStatusBarHeight() - val params = v.statusBarView.layoutParams as LinearLayout.LayoutParams - params.height = statusBarHeight - v.statusBarView.requestLayout() - - initData() - - initEvent() - - return v + container: ViewGroup? + ): SingleFragmentUserSettingsBinding { + return SingleFragmentUserSettingsBinding.inflate(inflater, container, false) } - fun initData() { + override fun setupTopBarLayout() { + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = requireContext().getStatusBarHeight() + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + binding.statusBarView.requestLayout() + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { Glide.with(requireContext()) .load(R.mipmap.ic_launcher) .apply(RequestOptions.circleCropTransform()) - .into(v.userAvatarView) + .into(binding.userAvatarView) val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean - v.warningSwitch.isChecked = isOpen + binding.warningSwitch.isChecked = isOpen val isRecord = SaveKeyValues.getValue(LocaleConstant.SINGLE_AUTO_RECORD, false) as Boolean - v.autoRecordSwitch.isChecked = isRecord + binding.autoRecordSwitch.isChecked = isRecord - v.appVersionView.text = BuildConfig.VERSION_NAME + binding.appVersionView.text = BuildConfig.VERSION_NAME //震动 vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } - fun initEvent() { - v.exitLoginView.setOnClickListener { + override fun initEvent() { + binding.exitLoginView.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -98,14 +87,14 @@ }).build().show() } - v.warningSwitch.setOnClickListener { + binding.warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) - v.warningSwitch.isChecked = false + binding.warningSwitch.isChecked = false return@setOnClickListener } } - v.warningSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.SINGLE_OPEN_WARNING, true) SoundPoolHelper.playSound(requireContext(), R.raw.alarm) @@ -115,7 +104,7 @@ SaveKeyValues.putValue(LocaleConstant.SINGLE_OPEN_WARNING, false) } } - v.autoRecordSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.autoRecordSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.SINGLE_AUTO_RECORD, true) } else { @@ -123,15 +112,15 @@ } } - v.helpLayout.setOnClickListener { + binding.helpLayout.setOnClickListener { requireContext().navigatePageTo() } - v.updateLayout.setOnClickListener { + binding.updateLayout.setOnClickListener { "已是最新版本,无需更新".show(requireContext()) } - v.backLayout.setOnClickListener { + binding.backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") diff --git a/app/src/main/res/layout/single_fragment_query_event.xml b/app/src/main/res/layout/single_fragment_query_event.xml index f2d7b92..50b1831 100644 --- a/app/src/main/res/layout/single_fragment_query_event.xml +++ b/app/src/main/res/layout/single_fragment_query_event.xml @@ -7,7 +7,9 @@ android:background="@color/mainBackground" android:orientation="vertical"> - + : AppCompatActivity() { + + protected lateinit var binding: VB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = initViewBinding() + setContentView(binding.root) + setupTopBarLayout() + initDefaultData(savedInstanceState) + observeRequestState() + initEvent() + } + + /** + * 初始化ViewBinding + */ + abstract fun initViewBinding(): VB + + /** + * 特定页面定制沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 数据请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 初始化业务逻辑 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt new file mode 100644 index 0000000..faf37c2 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/base/KotlinBaseFragment.kt @@ -0,0 +1,55 @@ +package com.casic.birmm.inspect.base + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.viewbinding.ViewBinding + +abstract class KotlinBaseFragment : Fragment() { + + private lateinit var _binding: VB + + protected val binding get() = _binding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { + _binding = initViewBinding(inflater, container) + return _binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initDefaultData(savedInstanceState) + setupTopBarLayout() + observeRequestState() + initEvent() + } + + /** + * 初始化布局以及控件 + */ + abstract fun initViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB + + /** + * 沉浸式状态栏 + */ + abstract fun setupTopBarLayout() + + /** + * 初始化默认数据 + */ + abstract fun initDefaultData(savedInstanceState: Bundle?) + + /** + * 网络请求状态监听 + */ + abstract fun observeRequestState() + + /** + * 业务逻辑,按钮等事件 + */ + abstract fun initEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt index 9caba1b..6719f30 100644 --- a/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt +++ b/app/src/main/java/com/casic/birmm/inspect/extensions/ByteArray.kt @@ -16,7 +16,7 @@ * 后面的是其他参数,不解析 * */ val builder = StringBuilder() - for (index in 1..12) { + for (index in 0..11) { builder.append(this[index].toInt().toChar()) } return builder.toString().replace("\r", "") diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt index d4a2a74..9f2c1e9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/DataLogPageFragment.kt @@ -3,20 +3,17 @@ import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import androidx.fragment.app.Fragment -import com.casic.birmm.inspect.R import com.casic.birmm.inspect.adapter.SubViewPagerAdapter +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentQueryDataLogBinding import com.pengxh.kt.lite.extensions.getStatusBarHeight -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.topTabLayout -import kotlinx.android.synthetic.main.single_fragment_query_data_log.view.viewPager -class DataLogPageFragment : Fragment() { +class DataLogPageFragment : KotlinBaseFragment() { - private val pageTitles = arrayOf("巡检记录", "事件记录") + private val titles = arrayOf("巡检记录", "事件记录") private var fragmentPages: ArrayList = ArrayList() init { @@ -24,28 +21,32 @@ fragmentPages.add(QueryEventFragment()) } - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - val v = inflater.inflate(R.layout.single_fragment_query_data_log, container, false) - - setupTopBarLayout(v) - - v.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, pageTitles) - //绑定 - v.topTabLayout.setupWithViewPager(v.viewPager) - - return v + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentQueryDataLogBinding { + return SingleFragmentQueryDataLogBinding.inflate(inflater, container, false) } - fun setupTopBarLayout(view: View) { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = view.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - view.statusBarView.setBackgroundColor(Color.WHITE) - view.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.WHITE) + binding.statusBarView.requestLayout() + } + + override fun initDefaultData(savedInstanceState: Bundle?) { + binding.viewPager.adapter = SubViewPagerAdapter(childFragmentManager, fragmentPages, titles) + //绑定 + binding.topTabLayout.setupWithViewPager(binding.viewPager) + } + + override fun observeRequestState() { + + } + + override fun initEvent() { + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt index e31924a..5065648 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/HomePageFragment.kt @@ -12,10 +12,8 @@ import android.os.Vibrator import android.util.Log import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.amap.api.location.AMapLocation import com.amap.api.maps.AMap @@ -26,6 +24,8 @@ import com.amap.api.maps.model.MyLocationStyle import com.amap.api.maps.model.PolylineOptions import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentMapInspectBinding import com.casic.birmm.inspect.extensions.addAll import com.casic.birmm.inspect.extensions.id import com.casic.birmm.inspect.extensions.toDataModel @@ -44,26 +44,13 @@ import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.addInspectionButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.bluetoothButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.currentValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.deviceStatusView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectNameView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.inspectTimeView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.mapView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.maxValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.newEventButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.refreshButton -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.settingsValueView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_map_inspect.view.stopInspectButton import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* @SuppressLint("MissingPermission") -class HomePageFragment : Fragment(), Handler.Callback { +class HomePageFragment : KotlinBaseFragment(), Handler.Callback { companion object { lateinit var weakReferenceHandler: WeakReferenceHandler @@ -72,7 +59,6 @@ private val kTag = "HomePageFragment" private val blueToothBeans: MutableList = ArrayList()//搜索展示列表 private val latLngs = LinkedList() - private lateinit var homeView: View private lateinit var vibrator: Vibrator private lateinit var aMap: AMap private var newInspectionModel: NewInspectionModel? = null//新建巡检数据结构模型 @@ -82,33 +68,24 @@ private var isGeneratingTask = false private var alarmCount = 0 private var connectedDeviceName = "" + private var isDataCommandOpened = false - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.single_fragment_map_inspect, container, false) - - setupTopBarLayout() - - initData(savedInstanceState) - - initEvent() - - return homeView + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): SingleFragmentMapInspectBinding { + return SingleFragmentMapInspectBinding.inflate(inflater, container, false) } - fun setupTopBarLayout() { + override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 val statusBarHeight = requireContext().getStatusBarHeight() - val params = homeView.statusBarView.layoutParams as LinearLayout.LayoutParams + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight - homeView.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) - homeView.statusBarView.requestLayout() + binding.statusBarView.setBackgroundColor(Color.parseColor("#D6EEFE")) + binding.statusBarView.requestLayout() } - fun initData(savedInstanceState: Bundle?) { + override fun initDefaultData(savedInstanceState: Bundle?) { vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator weakReferenceHandler = WeakReferenceHandler(this) @@ -120,8 +97,8 @@ "该设备不支持低功耗蓝牙".show(requireContext()) } - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER @@ -164,13 +141,17 @@ //设置按钮状态 if (newInspectionModel == null) { - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true } } - fun initEvent() { - homeView.addInspectionButton.setOnClickListener { + override fun observeRequestState() { + + } + + override fun initEvent() { + binding.addInspectionButton.setOnClickListener { AlertInputDialog.Builder().setContext(requireContext()).setTitle("请输入巡检标签") .setHintMessage("如:xxx区间巡检").setNegativeButton("放弃") .setPositiveButton("开始巡检") @@ -181,8 +162,8 @@ val startTime = currentTimeMillis.timestampToCompleteDate() //设置标题和时间 - homeView.inspectNameView.text = value - homeView.inspectTimeView.text = startTime + binding.inspectNameView.text = value + binding.inspectTimeView.text = startTime newInspectionModel = NewInspectionModel( currentTimeMillis.id(), value, startTime, @@ -192,8 +173,8 @@ ) //按钮状态 - homeView.stopInspectButton.isEnabled = true - homeView.addInspectionButton.isEnabled = false + binding.stopInspectButton.isEnabled = true + binding.addInspectionButton.isEnabled = false } override fun onCancelClick() { @@ -205,7 +186,7 @@ //地图左边三个按钮事件 menuButtonEvent() - homeView.newEventButton.setOnClickListener { + binding.newEventButton.setOnClickListener { if (newInspectionModel == null) { "还未开始巡检,无法新建事件".show(requireContext()) return@setOnClickListener @@ -231,7 +212,7 @@ private fun menuButtonEvent() { //结束巡检 - homeView.stopInspectButton.setOnClickListener { + binding.stopInspectButton.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -252,8 +233,8 @@ //蓝牙按钮 if (isBluetoothOn) { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) - homeView.bluetoothButton.setOnClickListener { + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setOnClickListener { if (curConnectState) { AlertControlDialog.Builder() .setContext(requireContext()) @@ -270,10 +251,11 @@ override fun onConfirmClick() { //断开连接 BLEManager.disConnectDevice() - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" - homeView.deviceStatusView.text = "设备编号:未连接" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + isDataCommandOpened = false "设备已断开连接".show(requireContext()) } }).build().show() @@ -300,11 +282,11 @@ } } } else { - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) } //重新发送指令按钮 - homeView.refreshButton.setOnClickListener { + binding.refreshButton.setOnClickListener { if (curConnectState) { BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) } else { @@ -317,13 +299,13 @@ when (msg.what) { LocaleConstant.BLUETOOTH_ON -> { "蓝牙已开启".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) isBluetoothOn = true } LocaleConstant.BLUETOOTH_OFF -> { "蓝牙已关闭".show(requireContext()) - homeView.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + binding.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) isBluetoothOn = false } @@ -385,14 +367,22 @@ if (bytes.first() == 51.toByte() && bytes.size >= 14) { //解析deviceCode //[51, 51, 50, 48, 48, 48, 48, 49, 48, 48, 48, 50, 13, 10] - homeView.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" + binding.deviceStatusView.text = "设备编号: ${bytes.toDeviceCode()}" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, bytes.toDeviceCode()) - BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } else if (bytes.first() == (-86).toByte() && bytes.size == 14) { handleMethaneData(bytes) } else { //如果收到错误数据,就保存设备编号 + binding.deviceStatusView.text = "设备编号: $connectedDeviceName" SaveKeyValues.putValue(LocaleConstant.DEVICE_CODE, connectedDeviceName) + if (!isDataCommandOpened) { + BLEManager.sendCommand(LocaleConstant.OPEN_TRANSFER_COMMAND) + isDataCommandOpened = true + } } } @@ -403,21 +393,22 @@ if (curConnectState) { BLEManager.disConnectDevice() } - homeView.deviceStatusView.text = "设备编号:未连接" - homeView.inspectNameView.text = "" - homeView.inspectTimeView.text = "" - homeView.currentValueView.text = "--" - homeView.settingsValueView.text = "--" - homeView.maxValueView.text = "--" + binding.deviceStatusView.text = "设备编号:未连接" + binding.inspectNameView.text = "" + binding.inspectTimeView.text = "" + binding.currentValueView.text = "--" + binding.settingsValueView.text = "--" + binding.maxValueView.text = "--" //按钮状态 - homeView.stopInspectButton.isEnabled = false - homeView.addInspectionButton.isEnabled = true + binding.stopInspectButton.isEnabled = false + binding.addInspectionButton.isEnabled = true //清除缓存 blueToothBeans.clear() latLngs.clear() SaveKeyValues.removeKey(LocaleConstant.DEVICE_CODE) + isDataCommandOpened = false LoadingDialogHub.dismiss() "巡检记录保存成功".show(requireContext()) @@ -571,9 +562,9 @@ * */ private fun handleMethaneData(bytes: ByteArray) { val dataModel = bytes.toDataModel() - homeView.currentValueView.text = dataModel.potency.toString() - homeView.settingsValueView.text = dataModel.alarmValue.toString() - homeView.maxValueView.text = dataModel.maxPotency.toString() + binding.currentValueView.text = dataModel.potency.toString() + binding.settingsValueView.text = dataModel.alarmValue.toString() + binding.maxValueView.text = dataModel.maxPotency.toString() //判断是否需要报警 val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean if (isOpen) { @@ -588,6 +579,10 @@ //如果连续超过10个报警,自动生成报警事件 alarmCount++ if (alarmCount >= 10) { + if (newInspectionModel == null) { + "没有巡检任务,无法自动记录报警".show(requireContext()) + return + } generateAlarmTask(dataModel.maxPotency) } } @@ -627,30 +622,30 @@ override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() val code = SaveKeyValues.getValue(LocaleConstant.DEVICE_CODE, "") as String if (code.isEmpty()) { - homeView.deviceStatusView.text = "设备编号: 未连接" + binding.deviceStatusView.text = "设备编号: 未连接" } else { - homeView.deviceStatusView.text = "设备编号: $code" + binding.deviceStatusView.text = "设备编号: $code" } //设置标题和时间 if (newInspectionModel == null) { return } - homeView.inspectNameView.text = newInspectionModel!!.name - homeView.inspectTimeView.text = newInspectionModel!!.startTime + binding.inspectNameView.text = newInspectionModel!!.name + binding.inspectTimeView.text = newInspectionModel!!.startTime } override fun onPause() { super.onPause() - homeView.mapView.onPause() + binding.mapView.onPause() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - homeView.mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } override fun onDestroyView() { @@ -661,6 +656,6 @@ override fun onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt index 3590faa..12137d7 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryEventFragment.kt @@ -4,13 +4,13 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.bumptech.glide.Glide import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.TaskEventLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryEventBinding import com.casic.birmm.inspect.single.view.EventDetailActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -19,15 +19,12 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.WeakReferenceHandler -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_event.view.eventRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryEventFragment : Fragment(), Handler.Callback { +class QueryEventFragment : KotlinBaseFragment(), Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -40,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081101) } else if (msg.what == 2023081101) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val eventListAdapter = object : NormalRecyclerAdapter( R.layout.item_event_rv_l, dataBeans ) { @@ -69,7 +66,7 @@ .setText(R.id.inspectDateView, "时间:${item.createTime}") } } - v.eventRecyclerView.adapter = eventListAdapter + binding.eventRecyclerView.adapter = eventListAdapter eventListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: TaskEventLocalBean) { @@ -81,16 +78,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_event, container, false) + container: ViewGroup? + ): SingleFragmentQueryEventBinding { + return SingleFragmentQueryEventBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt index 204da7d..8b7ea28 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/QueryInspectionFragment.kt @@ -4,12 +4,12 @@ import android.os.Handler import android.os.Message import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment import com.casic.birmm.inspect.bean.InspectionLocalBean +import com.casic.birmm.inspect.databinding.SingleFragmentQueryInspectBinding import com.casic.birmm.inspect.single.view.InspectionRouteActivity import com.casic.birmm.inspect.utils.DataBaseManager import com.casic.birmm.inspect.utils.LocaleConstant @@ -18,15 +18,13 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.include_empty_view.view.emptyView -import kotlinx.android.synthetic.main.single_fragment_query_inspect.view.inspectRecyclerView import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class QueryInspectionFragment : Fragment(), Handler.Callback { +class QueryInspectionFragment : KotlinBaseFragment(), + Handler.Callback { - private lateinit var v: View private var dataBeans: MutableList = ArrayList() companion object { @@ -39,9 +37,9 @@ weakReferenceHandler.sendEmptyMessage(2023081201) } else if (msg.what == 2023081201) { if (dataBeans.size == 0) { - v.emptyView.show("抱歉,无法查询到相关记录", null) + binding.emptyInclude.emptyView.show("抱歉,无法查询到相关记录", null) } else { - v.emptyView.hide() + binding.emptyInclude.emptyView.hide() val inspectListAdapter = object : NormalRecyclerAdapter( R.layout.item_inspect_rv_l, dataBeans ) { @@ -86,7 +84,7 @@ } } } - v.inspectRecyclerView.adapter = inspectListAdapter + binding.inspectRecyclerView.adapter = inspectListAdapter inspectListAdapter.setOnItemClickedListener(object : NormalRecyclerAdapter.OnItemClickedListener { override fun onItemClicked(position: Int, t: InspectionLocalBean) { @@ -98,16 +96,27 @@ return true } - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_query_inspect, container, false) + container: ViewGroup? + ): SingleFragmentQueryInspectBinding { + return SingleFragmentQueryInspectBinding.inflate(inflater, container, false) + } + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) + } - return v + override fun initEvent() { + } override fun onResume() { diff --git a/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt b/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt index a24a507..0a82d40 100644 --- a/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt +++ b/app/src/main/java/com/casic/birmm/inspect/single/fragment/SettingPageFragment.kt @@ -6,14 +6,14 @@ import android.os.Bundle import android.os.Vibrator import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import androidx.fragment.app.Fragment import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.casic.birmm.inspect.BuildConfig import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.base.KotlinBaseFragment +import com.casic.birmm.inspect.databinding.SingleFragmentUserSettingsBinding import com.casic.birmm.inspect.utils.LocaleConstant import com.casic.birmm.inspect.utils.SoundPoolHelper import com.casic.birmm.inspect.view.HelpCenterActivity @@ -24,60 +24,49 @@ import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.appVersionView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.autoRecordSwitch -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.backLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.exitLoginView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.helpLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.statusBarView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.updateLayout -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.userAvatarView -import kotlinx.android.synthetic.main.single_fragment_user_settings.view.warningSwitch -class SettingPageFragment : Fragment() { +class SettingPageFragment : KotlinBaseFragment() { - private lateinit var v: View private lateinit var vibrator: Vibrator - override fun onCreateView( + override fun initViewBinding( inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View { - v = inflater.inflate(R.layout.single_fragment_user_settings, container, false) - - //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = requireContext().getStatusBarHeight() - val params = v.statusBarView.layoutParams as LinearLayout.LayoutParams - params.height = statusBarHeight - v.statusBarView.requestLayout() - - initData() - - initEvent() - - return v + container: ViewGroup? + ): SingleFragmentUserSettingsBinding { + return SingleFragmentUserSettingsBinding.inflate(inflater, container, false) } - fun initData() { + override fun setupTopBarLayout() { + //根据不同设备状态栏高度设置statusBarView高度 + val statusBarHeight = requireContext().getStatusBarHeight() + val params = binding.statusBarView.layoutParams as LinearLayout.LayoutParams + params.height = statusBarHeight + binding.statusBarView.requestLayout() + } + + override fun observeRequestState() { + + } + + override fun initDefaultData(savedInstanceState: Bundle?) { Glide.with(requireContext()) .load(R.mipmap.ic_launcher) .apply(RequestOptions.circleCropTransform()) - .into(v.userAvatarView) + .into(binding.userAvatarView) val isOpen = SaveKeyValues.getValue(LocaleConstant.SINGLE_OPEN_WARNING, false) as Boolean - v.warningSwitch.isChecked = isOpen + binding.warningSwitch.isChecked = isOpen val isRecord = SaveKeyValues.getValue(LocaleConstant.SINGLE_AUTO_RECORD, false) as Boolean - v.autoRecordSwitch.isChecked = isRecord + binding.autoRecordSwitch.isChecked = isRecord - v.appVersionView.text = BuildConfig.VERSION_NAME + binding.appVersionView.text = BuildConfig.VERSION_NAME //震动 vibrator = requireContext().getSystemService(Context.VIBRATOR_SERVICE) as Vibrator } - fun initEvent() { - v.exitLoginView.setOnClickListener { + override fun initEvent() { + binding.exitLoginView.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") @@ -98,14 +87,14 @@ }).build().show() } - v.warningSwitch.setOnClickListener { + binding.warningSwitch.setOnClickListener { if (!vibrator.hasVibrator()) { "设备没有震动蜂鸣器,无法打开此开关".show(requireContext()) - v.warningSwitch.isChecked = false + binding.warningSwitch.isChecked = false return@setOnClickListener } } - v.warningSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.warningSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.SINGLE_OPEN_WARNING, true) SoundPoolHelper.playSound(requireContext(), R.raw.alarm) @@ -115,7 +104,7 @@ SaveKeyValues.putValue(LocaleConstant.SINGLE_OPEN_WARNING, false) } } - v.autoRecordSwitch.setOnCheckedChangeListener { _, isChecked -> + binding.autoRecordSwitch.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { SaveKeyValues.putValue(LocaleConstant.SINGLE_AUTO_RECORD, true) } else { @@ -123,15 +112,15 @@ } } - v.helpLayout.setOnClickListener { + binding.helpLayout.setOnClickListener { requireContext().navigatePageTo() } - v.updateLayout.setOnClickListener { + binding.updateLayout.setOnClickListener { "已是最新版本,无需更新".show(requireContext()) } - v.backLayout.setOnClickListener { + binding.backLayout.setOnClickListener { AlertControlDialog.Builder() .setContext(requireContext()) .setTitle("提示") diff --git a/app/src/main/res/layout/single_fragment_query_event.xml b/app/src/main/res/layout/single_fragment_query_event.xml index f2d7b92..50b1831 100644 --- a/app/src/main/res/layout/single_fragment_query_event.xml +++ b/app/src/main/res/layout/single_fragment_query_event.xml @@ -7,7 +7,9 @@ android:background="@color/mainBackground" android:orientation="vertical"> - + - +